【问题标题】:Converting Message to HttpRequestMessage object causes this failure "Expecting element 'Stream' from namespace"将消息转换为 HttpRequestMessage 对象会导致此失败“期望来自命名空间的元素‘流’”
【发布时间】:2016-02-26 21:28:31
【问题描述】:

我正在使用以下方法将Message对象转换为HttpRequestMessage

HttpRequestMessage shadowRequestMessage = Message.ToHttpRequestMessage();

扩展方法的实现见以下链接,由.NET framework提供

MessageExtensionMethodsToHttpRequestMessage 方法

当我调用ToHttpRequestMessage 方法时,它给了我以下异常

{"Expecting element 'Stream' from namespace 'http://schemas.datacontract.org/2004/07/System.IO'.. Encountered 'Element'  with name 'SayHello', namespace 'http://tempuri.org/'. "}

这是 Message 对象的值:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:38405/OriginalService.svc</To>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IOriginalService/SayHello</Action>
  </s:Header>
  <s:Body>... stream ...</s:Body>
</s:Envelope>

失败堆栈跟踪:

 at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
   at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
   at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader reader)
   at System.ServiceModel.Channels.Message.GetBodyCore[T](XmlDictionaryReader reader, XmlObjectSerializer serializer)
   at System.ServiceModel.Channels.MessageExtensionMethods.CreateMessageContent(Message message, Boolean suppressEntityBody)
   at System.ServiceModel.Channels.MessageExtensionMethods.CreateRequestMessage(Message message, HttpRequestMessageProperty requestMessageProperty)
   at System.ServiceModel.Channels.MessageExtensionMethods.ToHttpRequestMessage(Message message)

这是示例应用程序:

[ServiceContract]
public interface IOriginalService
{
        [OperationContract]
        string SayHello();
}

public class OriginalServiceSvc : IOriginalService
{
       public string SayHello()
        {
            return "Hello";
        }
}

谁能解释一下我该如何解决这个问题?

【问题讨论】:

  • 你需要提供抛出异常的代码,你的服务实现是相当无关紧要的。
  • @CodingGorilla 此方法导致问题:HttpRequestMessage shadowRequestMessage = Message.ToHttpRequestMessage();此扩展方法由 .NET 库 referencesource.microsoft.com/#System.ServiceModel.Channels/… 提供。我也将此信息添加到问题中。让我知道我是否缺少任何东西。谢谢

标签: c# .net wcf serialization httprequest


【解决方案1】:

该方法 (MessageExtensionMethods.ToHttpRequestMessage) 不能用于将任意 Message 实例转换为 HttpRequestMessage。它只能用于特定的消息类型(基于字节数组创建)。不幸的是,该方法的文档没有指定此限制,这可能会导致像您这样的问题。

如果要将任意 WCF 消息转换为 HttpRequestMessage 实例,则需要 MessageEncoder,它是负责转换 WCF 消息体的 WCF 组件(内部由 XML Infoset 表示,但其内容编码后不一定需要是 XML)转换成字节(你可以用它来创建HttpRequestMessage)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多