【问题标题】:POST HttpRequestMessage is nullPOST HttpRequestMessage 为空
【发布时间】:2018-09-14 22:49:54
【问题描述】:

我在 ASP.NET Core 中有一个 Web API,该方法具有以下签名:

[HttpPost]
public HttpResponseMessage Foo(HttpRequestMessage data)

这是我发送给操作的数据:

<s:Envelope
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <DTO
            xmlns="http://tempuri.org/">
            <field1>1</field1>
            <field2>2</field2> 
        </DTO>
    </s:Body>
</s:Envelope>

我正在向 Postman 提出请求,其中 Data 是一个肥皂 xml 消息。 标头的 Content-Type: :"application/xml" (也试过:application/x-www-form-urlencoded)

出于某种奇怪的原因,当我尝试读取此数据时,我可以看到以下内容: 方法:获取 内容:无 请求网址:空 标头:{{}}

在开始时,我还包括了 XmlFormatters(假设这是问题的根源):

services.AddMvc(options =>
        {
            options.RespectBrowserAcceptHeader = true;
            options.InputFormatters.Add(new XmlSerializerInputFormatter());
            options.OutputFormatters.Add(new XmlSerializerOutputFormatter());                    
        }
    );

但这并没有帮助。

我还有另一个 Web Api(用于 .NET Framework),我成功接收到 HttpRequestMessage 参数。

问题的根源是什么?

【问题讨论】:

  • .Net 和 Core 应用程序和代码是否相同?
  • 两个应用程序中的代码除了 Startup 之外是相同的,正如我提到的,我试图让 xmlformatters 认为这可能会解决问题

标签: c# asp.net-web-api asp.net-core


【解决方案1】:

ASP.NET Core 不处理开箱即用的 SOAP 请求。您需要添加一些中间件来处理 SOAP 消息。我以前用过这个项目,效果很好:

https://github.com/DigDes/SoapCore

这里有她如何使用库的详细演练:

https://stackify.com/soap-net-core/

【讨论】:

  • 对不起,我可能还不够清楚。我刚刚编辑了我的帖子,提供了我发送的数据样本。
【解决方案2】:

Model binding in ASP.NET Core 的工作方式与以前的版本不同。


所以第一步是正确的 - 您注册了 XML 格式化程序以允许 MVC 中间件将其用于模型绑定,因为默认情况下只添加了 JSON 格式化程序。

下一步也是正确的 - 您添加了 Content-Type: application/xml 标头以告知您使用 HTTP POST 发送的内容类型。

您应该添加的是告诉 MVC 中间件您的数据在 request body 中传递。这是通过将[FromBody] 属性添加到模型参数来完成的:

[FromBody]:使用配置的格式化程序绑定请求正文中的数据。根据请求的内容类型选择格式化程序。

并且由于 XML 格式化程序将在内部进行反序列化,您需要将操作参数更新为代表您的 XML 数据结构的类型。

这样的东西应该是最终的:

[HttpPost]
public HttpResponseMessage Foo([FromBody] ClassThatRepresentsXMLstructure data)

【讨论】:

  • 不,它不起作用。如果我使用 [FromBody] 我会得到 mediatype 异常
  • @JoeDoe 这个异常告诉我们需要其他类型的格式化程序。也许您需要为您的肥皂数据定制一个。或者您需要指定其他内容类型。试试application/soap+xml
  • 我试过 application/soap+xml - 它不起作用。不确定您在谈论哪种其他格式化程序。请看上面我发送的数据示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 2018-01-27
  • 2013-04-22
  • 2013-04-27
  • 2020-07-16
相关资源
最近更新 更多