iis .NET核心Web API仅从Mock Lambda工具获取JSON,使用Postman、Swagger和AWS Lambda失败

sr4lhrrt  于 2022-11-12  发布在  .NET
关注(0)|答案(2)|浏览(119)

我最近写了一个.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的唯一方法?
谢谢

8e2ybdfx

8e2ybdfx1#

这是因为您在请求正文中发送JSON而不是在querystring中发送JSON吗?

[HttpPost]
 public IActionResult DataTranslation([FromBody] Transaction transactionData)
 {

https://learn.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api#using-frombody 邮件使用

yacmzcpb

yacmzcpb2#

更新。我了解到AWS的Lambda需要一个VPC到我的内部VM,该VM在IIS上托管API。这解决了为什么AWS的Lambda反复超时的问题。
至于 Postman 和斯瓦格的问题,问题是模拟Lambda工具以其自然的完整格式发送整个SNS消息事件,然后Lambda提取消息部分,仅发送到API。
我发送了整个SNS消息事件横跨斯瓦格和 Postman ,这两个都不做的工作,λ做的是剥离只是SNS事件的消息部分。
有一次,我只发送了信息部分与斯瓦格和 Postman ,都工作。
我必须给予我的工作伙伴多里安在这件事上帮了我的忙。谢谢

相关问题