POST HttpRequestMessage为null

时间:2018-04-05 07:45:49

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

我在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是一个soap xml消息。 标题'Content-Type ::“application / xml” (也尝试过:application / x-www-form-urlencoded)

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

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

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

但它没有帮助。

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

问题的根源是什么?

2 个答案:

答案 0 :(得分:0)

ASP.NET Core无法开箱即用地处理SOAP请求。您需要添加一些中间件来处理SOAP消息。我之前使用过这个项目并且效果非常好:

https://github.com/DigDes/SoapCore

有关如何使用图书馆的详细演练:

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

答案 1 :(得分:0)

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

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

下一步也是对的 - 您添加了<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/2.1.3/d3.min.js"></script> <div style="display: table; width: 50px; height: 111.717px;"><span class="nodeText" style="display: table-cell; vertical-align: middle; text-overflow: ellipsis; font-family: Arial; font-size: 10px; font-style: normal; font-weight: normal; color: black; opacity: 1;">Exact 765 (55.23%)</span></div>标头来告诉您使用HTTP POST发送的内容类型。

您应该添加的内容是告诉MVC中间件您的数据是否在Content-Type: application/xml中传递。这是通过向模型参数添加request body属性来完成的:

  

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

并且导致XML格式化程序在内部进行反序列化,您需要将action参数更新为表示XML数据结构的类型。

这样的事情应该是最终的:

[FromBody]