从 WebAPI 调用的正文中读取 XML 内容在开始时被中断

Posted

技术标签:

【中文标题】从 WebAPI 调用的正文中读取 XML 内容在开始时被中断【英文标题】:Reading XML content from Body of WebAPI call is cut off at beginning 【发布时间】:2013-11-11 19:34:13 【问题描述】:

我正在创建一种代理服务,它需要处理包含 XML 的调用,从 POST 的主体到我的 WebAPI 服务,然后将 POST 到另一个服务。

奇怪的是,当我收到来自POST 的 XML 消息时,正文中的第一部分 XML 被切断了。最初我认为可能是缓冲区大小,或者消息太大,所以我删除了很多正在发送的 XML 测试消息,以减少发送的内容。然而,XML 仍然在同一个地方被截断。

我尝试了以下(2)种方法来读取WebAPI服务中的XML BODY,结果是一样的:

var reader = new StreamReader(Request.Content.ReadAsStreamAsync().Result);
string originalMessage = reader.ReadToEnd();

和:

        var result = "";
        Request.Content.ReadAsStreamAsync().ContinueWith(x =>
        

            using (var sr = new StreamReader(x.Result))
            
                result = sr.ReadToEnd();
            
        );

这是一个 sn-p 原始 XML:

<Message version="123" release="001" xmlns="http://www.mysite.com/schema">
  <Header>
    <To Att1="A">001</To>
    <From Att2="B">002</From>
    <ID>9876</ID>

这是在 WebAPI 控制器POST 中阅读内容后的开头

</To>
    <From Att2="B">002</From>
    <ID>9876</ID>

看看它是如何从&lt;To&gt; 元素的“结束”标签开始的?这显然不是它所发送的 XML 的开头。

更奇怪的是“内容大小”在发送之前和之后检查时双方都是 4188。另一个有趣的事情是我有一个老式的.asmx 测试器(而不是Web API 服务),它做同样的事情。当我使用以下内容读取该应用程序中的传入 XML 消息时:

    // Get raw request body
    Stream receiveStream = HttpContext.Current.Request.InputStream;

    // Move to beginning of input stream and read
    receiveStream.Position = 0;
    using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8))
    
    // Load into XML document
    xmlSoapRequest.Load(readStream);
    

...我看到了 full XML 消息。所以不知道为什么.asmx 可以读取它,但不能完全读取 WebAPI 服务。

我在我的 WebAPI POST 调用中做错了什么,我看不到请求正文中发送的完整 XML 消息?

【问题讨论】:

【参考方案1】:

嗯,我发现了这个问题,但不是 100% 确定原因。我用于POST 的参数是开箱即用的参数:

public HttpResponseMessage Post([FromBody]string value)

我将其改为将请求作为POST 上的参数:

public HttpResponseMessage Post(HttpRequestMessage request)

当我执行上述第二个选项时,我开始按预期从请求中获取整个 XML 正文。

【讨论】:

第一个方法签名导致 Web API 使用当前配置的 XML 序列化器尝试将您的消息反序列化为“字符串”对象,这根本不是您想要做的。第二种方法更有意义,因为您不会尝试通过网络对对象进行序列化。

以上是关于从 WebAPI 调用的正文中读取 XML 内容在开始时被中断的主要内容,如果未能解决你的问题,请参考以下文章

C# WebApi Xml序列化问题解决方法:“ObjectContent`1”类型未能序列化内容类型“application/xml;charset=utf-8"的响应正文。...

ASP.NET Web API 无法从 POST 正文中读取

如何在 asp.net 核心 webapi 控制器中读取请求正文?

“ObjectContent`1”类型未能序列化内容类型“application/xml; charset=utf-8”的响应正文。

如何从 httpclient 调用中获取内容正文?

如何在 POST 正文中为 asp.net WebAPI POST 路由格式化 XML