具有应用程序/ x-www-form-urlencoded内容类型但在NET Core Web API中为XML正文的句柄请求

问题描述 投票:0回答:1

我有一个.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>
c# xml asp.net-core-webapi content-type asp.net-core-2.1
1个回答
0
投票

很容易获得字符串并将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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.