【发布时间】:2020-02-18 00:46:52
【问题描述】:
我有一个应该使用 POST XML 请求的 .NET Core 2.1 Web API 控制器和方法 通过 HTTP 从外部服务。 下面是控制器动作的方法头。
[HttpPost]
[Produces("application/xml")]
public async Task<IActionResult> PostReceivedMessage([FromBody] ReceivedMessage receivedMessage)
我编写了一个自定义 XML 输入格式化程序来处理 XML 请求,当 我将来自 Postman 的示例 XML 请求发布到应用程序的控制器操作。 但是当服务发送类似请求时,应用的响应状态为 400,Bad Request。
经过一些调试,我发现请求进来了
内容类型:application/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>
【问题讨论】:
-
收到的请求是什么样的?你能发一个样本吗?
-
使用像 wireshark 或 fiddler 这样的嗅探器,并在 postman 中将第一个请求与非工作 c# 应用程序进行比较。然后让 c# 看起来完全像邮递员的请求。 c# 的默认标头与 postman 不同,使 c# 请求看起来像 postman 将解决问题。
-
@JSteward 更新了帖子以包含示例。
-
@jdweng 已经使用 Wireshark 来比较两个请求。这就是我发现错误请求状态仅在使用 Content-type: application/x-www-form-urlencoded 而不是使用 Content-type: application/xml 时返回的原因。
-
获取 XML,而不是 x-www-form-urlencoded。您应该能够从响应中获取 xml 作为字符串。然后使用 XML 方法处理 xml 字符串。
标签: c# xml asp.net-core-webapi content-type asp.net-core-2.1