2010-09-23 52 views
0

我必须调用一个对于它选择处理的SOAP消息格式极其苛刻(非标准)的Web服务。我无法控制服务器端的实现,并且没有WSDL可用,我所拥有的是一个截取的消息,附在下面。WCF MesageContract - 自定义传出SOAP消息 - 多个机构

我的第一个想法是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

请发布您尝试的消息合约,并显示生成的XML。该服务实际上是否反对Action元素?为什么?如果它不能识别它,那么它应该忽略它(除非它设置了mustUnderstand标志)。 – 2010-09-23 00:36:39

回答

0

如果你不想使用地址头,你必须使用绑定没有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演员属性。您的消息没有为前缀e定义名称空间,因此消息不是有效的XML。

+0

谢谢,拉迪斯拉夫! “IsWrapped = false”部分是缺少的部分。将它与Namespace声明在所有级别上结合似乎都可以做到,请求正在运行。如果我只能在一个地方声明“http://www.w3.org/2001/XMLSchema-instance”命名空间,或者更好,根本没有(服务不需要它),这将是更好的,但现在这部分似乎是工作和优化不是最重要的:) – 2010-09-23 19:56:07