wcf - 为什么 WCF 将请求/响应类型包装在另一个 XML 元素中,以及如何防止这种情况?

标签 wcf message datacontractserializer

我有一个简单的回显服务,我在其中定义了一个操作方法和一对请求/响应类型:

[ServiceContract(Name = "EchoService", 
                 Namespace = "http://example.com/services", 
                 SessionMode = SessionMode.NotAllowed)]
public interface IEchoService
{
    [OperationContract(IsOneWay = false,
                       Action = "http://example.com/services/EchoService/Echo", 
                       ReplyAction = "http://example.com/services/EchoService/EchoResponse")]
    EchoResponse Echo(EchoRequest value);
}

数据类型:
[Serializable]
[DataContract(Namespace = "http://example.com/services/EchoService", 
              Name = "EchoRequest")]
public class EchoRequest
{
    public EchoRequest() { }

    public EchoRequest(String value)
    {
        Value = value;
    }

    [DataMember]
    public String Value { get; set; }
}

[Serializable]
[DataContract(Namespace = "http://example.com/services/EchoService", 
              Name = "EchoResponse")]
public class EchoResponse
{
    public EchoResponse() { }

    public EchoResponse(String value)
    {
        Value = value;
    }

    [DataMember]
    public String Value { get; set; }
}

在 EchoRequest 的实例上调用 Message.CreateMessage() 会产生:
  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header />
    <s:Body>
      <EchoRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/services/EchoService">
        <Value>hello, world!</Value>
      </EchoRequest>
    </s:Body>
  </s:Envelope>

……这正是我想要的。但是,该服务似乎希望将消息正文进一步包装在另一个 XML 元素中,如下所示:
  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header />
    <s:Body>
      <Echo xmlns="http://example.com/services">
        <EchoRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/services/EchoService">
          <Value>hello, world!</Value>
        </EchoRequest>
      </Echo>
    </s:Body>
  </s:Envelope>

更新:
感谢 Mark 的回复,我在请求/响应类型上探索了 MessageContract 而不是 DataContract。这似乎更接近我想要的,但现在它走得太远了,并且不期望外部类型元素“EchoRequest”。

这令人困惑,因为不知何故 Message.CreateMessage 似乎总是能生成正确的 XML,所以它显然使用了一些默认序列化,我想将服务配置为接受。我只是误解了 Message.CreateMessage 的工作原理吗?

最佳答案

IIRC、WCF 默认使用“Wrapped”消息样式。如果您希望能够控制消息的序列化方式,可以通过使用 MessageContractAttribute 进行装饰来定义显式消息。 .使用显式消息契约,您可以设置 IsWrapped属性(property)到false .

在您的情况下,我认为 EchoRequest 和 EchoResponse 根本不应该是 DataContracts,而应该是 MessageContracts。对我来说,它们看起来很像 MessageContracts。

关于wcf - 为什么 WCF 将请求/响应类型包装在另一个 XML 元素中,以及如何防止这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1130032/

相关文章:

c# - DataContractSerializer 不调用我的构造函数?

c# - WCF:具有多个模块的数据协定序列化程序

.net - 无法创建抽象类?

vb.net - Visual Basic 自动售货机

c++ - 我想将来自 ROS 主题的消息存储在数组中以供进一步阐述

php - Magento:如何在管理面板中使用 JS 显示标准错误/成功消息?

c# - 具有长属性名称的 WCF DataContractSerializer 性能

javascript - Angularjs 应用程序无法从 Wcf 服务返回消息

javascript - 循环ajaxcallback(WCF服务)

wcf - 声明不同程序集中数据协定的已知类型