我在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参数。
问题的根源是什么?
答案 0 :(得分:0)
ASP.NET Core无法开箱即用地处理SOAP请求。您需要添加一些中间件来处理SOAP消息。我之前使用过这个项目并且效果非常好:
https://github.com/DigDes/SoapCore
有关如何使用图书馆的详细演练:
答案 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]