我正在创建一种代理服务,它需要处理包含 XML 的调用,从 a 的主体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();
}
});
这是原始 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 服务。
我在 WebAPIPOST
调用中看不到请求正文中发送的完整 XML 消息的地方做错了什么?