WCF MesageContract - 自定义传出的SOAP消息 - 多个主体

时间:2010-09-23 00:12:52

标签: wcf soap messagecontract

我必须调用一个对其选择处理的SOAP消息格式要求极高(非标准)的Web服务。我无法控制服务器端实现,也没有可用的WSDL,我所拥有的是截获的截获消息。

我的第一个想法是WCF + MessageContract,但无论我对上一次做什么,我似乎无法得到正确的结果。传出消息应该看起来像下面的消息。最棘手的部分似乎是多个主体内容(“ProxyInfo”和“PayloadInfo”下面)。除此之外,我也无法让WCF从SOAP消息头中删除“Action”元素。我意识到它是WCF的一个重要元素,但我怀疑我能否说服Web服务接受它。答案可能是另一个故事,但是当我到达时,我将穿过那座桥。

目前我正在考虑传出/传入消息的自定义序列化和后/预处理。在最坏的情况下,我想我将不得不手动执行Web请求以及序列化。请帮忙,我真的很绝望......

<?xml version="1.0" encoding="UTF-8" ?>
<e:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
 <e:Header>
  <ServiceHeader xmlns="http://services/serviceheader" e:actor="http://services/loadbalancer" >
   <ServiceLevel>
    <Type>HIGH</Type>
    <Method>FIFO</Method>
   </ServiceLevel>
  </ServiceHeader>
 </e:Header>
 <e:Body>
  <ProxyInfo xmlns="http://services/proxyinfo">
   <Server>
    <Address>proxy1:8080</Address>
    <AppId>case_delegator</AppId>
   </Server>
  </ProxyInfo>
  <PayloadInfo xmlns="http://services/payload">
   <GetConfirmation>
    <CaseId>
     <Id>9728DFC889874CC8B1505D91E33FCFCD</Id>
    </CaseId>
   </GetConfirmation>
  </PayloadInfo>
 </e:Body>
</e:Envelope>

1 个答案:

答案 0 :(得分:0)

如果您不想使用Address标头,则必须使用不带WS-Addressing的绑定。在您的情况下使用BasicHttpBinding。它不会使用WS-Addressing和Action SOAP标头,而是使用SOAPAction HTTP标头。

对于您的邮件合同,请尝试使用以下内容:

[DataContract]
public class ServiceHeader
{
  ...
}

[DataContract]
public class ProxyInfo
{
  ...
}

[DataContract]
public class PayloadInfo
{ 
  ...
}

[MessageContract(IsWrapped = false)]
public class Request
{
  [MessageHeader(Namespace="http://services/serviceheader")]
  public ServiceHeader ServiceHeader { get; set; }

  [MessageBodyMember(Namespace="http://services/proxyinfo")]
  public ProxyInfo ProxyInfo { get; set; }

  [MessageBodyMember(Namespace="http://services/payload")]
  public PayloadInfo PayloadInfo { get; set; }
}

奇怪的是ServiceHeader中的actor属性。您的消息未定义前缀e的命名空间,因此消息不是有效的XML。