我正在创建一种代理服务,需要处理包含从POST
正文到我的WebAPI服务的XML的调用,然后将POST
处理到另一个服务。
奇怪的是,当我从POST
收到来自正文的XML的第1部分的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消息的地方,我做错了什么?
答案 0 :(得分:11)
我确定了问题,但并非100%确定原因。我用于POST
的参数是开箱即用的参数:
public HttpResponseMessage Post([FromBody]string value)
我将其更改为将请求作为参数POST
代替:
public HttpResponseMessage Post(HttpRequestMessage request)
当我执行上面的第二个选项时,我开始按预期从请求中获取整个XML正文。