从 Web 主体读取 XML 内容 API 调用在开始时被切断



我正在创建一种代理服务,该服务需要处理从POST正文到我的 WebAPI 服务的包含 XML 的调用,然后将其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();
            }
        });

下面是原始 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>

看看它是如何从<To>元素的"关闭"标签开始的?这显然不是发送的 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);
    }

。我看到完整的 XML 消息。所以不确定为什么.asmx可以读取它,但不能完全读取 WebAPI 服务。

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

好吧,我想出了问题,但不是 100% 确定原因。我用于POST的参数是开箱即用的参数:

public HttpResponseMessage Post([FromBody]string value)

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

public HttpResponseMessage Post(HttpRequestMessage request)

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

最新更新