我最近写了一个.NET核心Web API来接收来自Lambda SNS消息事件的JSON。Lambda将SNS事件消息JSON(通过POST请求)发送到API。
当我使用“Mock Lambda工具”将SNS消息发送到API时,一切都很好。它工作得很好。数据到达时,我的API控制器看到它,并将其发送到解析数据的类,然后将其发送到数据库中。
因此,我随后将API发布到IIS,并使用Mock Lambda工具对其进行了测试。
我将Lambda上传到AWS(用于真实的场景)后感觉不错,我使用AWS Lambda控制台对相同的SNS消息(JSON)进行了快速测试。超时。
因此,我决定回去尝试使用Postman在IIS上测试API。
**POST**https://my.company.com/api/Transaction/
**201**
2.69 s
POST /api/Transaction/ HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.29.2
Accept: */*
Cache-Control: no-cache
Postman-Token: 4173d96a-1583-4c64-82b1-f67acaf8f0c7
Host: my.company.com
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 4274
* (I'm omitting the HUGE json message area. It's standard format.)*
**HEADER INFO**
HTTP/1.1 201 Created
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Location: https://my.company.com/api/Transaction/
Server: Microsoft-IIS/10.0
Date: Wed, 10 Aug 2022 01:04:41 GMT
**RESPONSE BODY**
{"Id":0,"email":null,"token":null,"storeNumber":null,"transactionDateTime":"0001-01-01T00:00:00","transactionId":null,"orderData":null}
没有错误,但请注意,* 响应正文 * 全部为空值。
我决定从Visual Studio运行API,这样我就可以在SNS消息从Lambda到达时单步执行代码。
- 使用模拟Lambda工具,没有错误。数据通过所有的方式。
- 使用Postman时,控制器上的断点显示没有事务数据到达(NULL)。
- 使用Swagger时,控制器上的断点显示没有事务数据到达(NULL)。
有没有什么想法,我错过了什么或做错了什么?
这是我的控制器中的API:
using Microsoft.AspNetCore.Mvc;
using MyWebAPI.TransactionData;
using MyWebAPI.Models;
namespace MyWebAPI.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class TransactionController : ControllerBase
{
private readonly ITransactionData _transactionData;
public TransactionController(ITransactionData transactionData)
{
_transactionData = transactionData;
}
[HttpGet]
public string Get()
{
return "You have reached the .NET Core Web API (web service).";
}
[HttpPost]
public IActionResult DataTranslation(Transaction transactionData)
{
_transactionData.DataTranslation(transactionData); // entry point
return Created(
HttpContext.Request.Scheme
+ "://" + HttpContext.Request.Host
+ "" + HttpContext.Request.Path
+ "/" + transactionData.transactionId, transactionData
);
}
}
}
下面是我在Lambda中的POST请求:
public void PostRequest(string msg)
{
var url = "https://my.company.com/api/Transaction/"; // IIS
var httpRequest = (HttpWebRequest)WebRequest.Create(url);
httpRequest.Method = "POST";
httpRequest.Accept = "application/json";
httpRequest.ContentType = "application/json";
var data = msg;
try
{
// Write request data to stream
using (var streamWriter = new StreamWriter(httpRequest.GetRequestStream()))
{
streamWriter.Write(data);
}
// Get a response from IIS (REST API)
var httpResponse = (HttpWebResponse)httpRequest.GetResponse();
// Read the body of the response from the server
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
}
// Log the status code
Log.Logger.Information(@"httpResponse: " + httpResponse.StatusCode);
}
catch (WebException wex)
{
Log.Logger.Information($"[ERROR] WebException, {wex}");
Log.Logger.Information($"[ERROR] WebException Message, {wex.Message}");
Log.Logger.Information($"[ERROR] WebException Response, {wex.Response}");
Log.Logger.Information($"[ERROR] WebException Response, {wex.Response.Headers}");
Log.Logger.Information($"[ERROR] WebException Response, {wex.Response.ResponseUri}");
string pageContent = new StreamReader(wex.Response.GetResponseStream()).ReadToEnd().ToString();
Log.Logger.Information($"[ERROR] pageContent, {pageContent}");
}
catch (Exception ex)
{
Log.Logger.Information($"[ERROR] Exception, {ex}");
}
return;
}
我很好奇是不是我的帖子请求有问题?
为什么“模拟Lambda工具”是我将数据传输到API的唯一方法?
谢谢
2条答案
按热度按时间8e2ybdfx1#
这是因为您在请求正文中发送JSON而不是在querystring中发送JSON吗?
https://learn.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api#using-frombody 邮件使用
yacmzcpb2#
更新。我了解到AWS的Lambda需要一个VPC到我的内部VM,该VM在IIS上托管API。这解决了为什么AWS的Lambda反复超时的问题。
至于 Postman 和斯瓦格的问题,问题是模拟Lambda工具以其自然的完整格式发送整个SNS消息事件,然后Lambda提取消息部分,仅发送到API。
我发送了整个SNS消息事件横跨斯瓦格和 Postman ,这两个都不做的工作,λ做的是剥离只是SNS事件的消息部分。
有一次,我只发送了信息部分与斯瓦格和 Postman ,都工作。
我必须给予我的工作伙伴多里安在这件事上帮了我的忙。谢谢