读取请求消息正文时出错

Posted

技术标签:

【中文标题】读取请求消息正文时出错【英文标题】:Error while reading body of request message 【发布时间】:2016-03-04 01:53:26 【问题描述】:

我需要阅读 WCF 项目中的消息内容,例如

 var messageContent = Encoding.UTF8.GetString(OperationContext.Current.RequestContext.RequestMessage.GetBody<byte[]>());

但结果我得到了一个错误:

期望来自命名空间的元素“base64Binary” 'http://schemas.microsoft.com/2003/10/Serialization/'..遇到 名称为“人类”的“元素”,命名空间 'http://numans.hr-xml.org/2007-04-15'。

你能告诉我我做错了什么吗?

我发送的内容是:

<Human xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://numans.hr-xml.org/2007-04-15">
  <HumanId>
    <guid>c2ee9a7e-c7a8-48e0-910b-47c2012bfa8e</guid>
  </HumanId>
  ...
</Human>

我还尝试阅读以下内容:

var messageContent = OperationContext.Current.RequestContext.RequestMessage.ToString();

消息内容的结果:

...流...

【问题讨论】:

你能把这两个方法调用分开并确定它在哪里抛出吗? GeyBodyGetString? GetBody() 的问题 【参考方案1】:

GetBody&lt;T&gt; is used to deserialize the message body as type T. 因此,当您调用GetBody&lt;byte[]&gt;() 时,反序列化器需要base64 编码的二进制数据,但会找到&lt;Human&gt; 元素。

如果您只想将邮件正文读取为string,请使用GetReaderAtBodyContents,它返回一个XmlDictionaryReader,您可以在其中使用ReadOuterXml()

如果您想将正文作为输入内容读取,请从其 XML 表示创建一个 Human 类并使用 GetBody&lt;Human&gt;()

【讨论】:

谢谢。我用过:using (var reader = context.RequestContext.RequestMessage.GetReaderAtBodyContents())Content = reader.ReadOuterXml();

以上是关于读取请求消息正文时出错的主要内容,如果未能解决你的问题,请参考以下文章

反序列化操作“queryAll”消息的回复消息正文时出错:

发送 Web 服务请求时出错:必须提供请求正文

读取请求正文两次

调用 API 时解析正文出错

未读取请求正文时的 ERR_INCOMPLETE_CHUNKED_ENCODING

servlet 中读取请求正文的问题