我有一个.NET Core 2.1 Web API控制器和方法,应该使用POST XML请求通过HTTP从外部服务中获取。下面是控制器操作的方法头。
[HttpPost]
[Produces("application/xml")]
public async Task<IActionResult> PostReceivedMessage([FromBody] ReceivedMessage receivedMessage)
我写了一个自定义XML输入格式化程序来处理XML请求,当我将来自Postman的示例XML请求发布到应用程序的控制器操作中。但是,当服务发送类似请求时,来自应用程序的响应的状态为400,错误请求。
经过一些调试后,我发现请求来自
内容类型:应用程序/ x-www-form-urlencoded
而不是人们可能期望的application / xml或text / xml。如果我更改标题以使其与内容类型匹配,则应用程序会显示相同的行为外部服务发送的请求。
我假设x-www-form-urlencoded用于表单数据,因为模型绑定不起作用当我将动作标题更改为:
public async Task<IActionResult> PostReceivedMessage([FromForm] ReceivedMessage receivedMessage)
由于我无法控制外部服务,如何使控制器动作能够处理以x-www-form-urlencoded为内容类型的XML请求?
更新:下面是一个示例请求:
POST /check/api/receivedmessages HTTP/1.1
Cache-Control: no-cache
Pragma: no-cache
User-Agent: Java/1.7.0_45
Host: xxx.xxx.xxx.xxx
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
Content-type: application/x-www-form-urlencoded
Content-Length: 270
<Request><requestId>95715274355861000</requestId><msisdn>345678955041</msisdn><timeStamp>2019/10/20 02:23:55</timeStamp><keyword>MO</keyword><dataSet><param><id>UserData</id><value>VHVqrA==</value></param><param><id>DA</id><value>555</value></param></dataSet></Request>
很容易获得字符串并将xml字符串转换为C#对象:
[HttpPost]
[Produces("application/xml")]
public async Task<IActionResult> PostReceivedMessage([FromForm]string receivedMessage)
{
XmlSerializer serializer = new XmlSerializer(typeof(ReceivedMessage));
ReceivedMessage data;
using (TextReader reader = new StringReader(receivedMessage))
{
data = (BaseClass)serializer.Deserialize(reader);
}
return Ok(data);
}