小编pel*_*zem的帖子

如何使用ClientInspector修改WCF消息头的MustUnderstand

我从WCF客户端调用非WCF服务.WCF客户端包括设置为"1"的"MustUnderstand"标头属性.这是典型的SOAP请求:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
    <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
        <u:Timestamp u:Id="_0">
            <u:Created>2010-08-23T20:48:52.680Z</u:Created>
            <u:Expires>2010-08-23T20:53:52.680Z</u:Expires>
        </u:Timestamp>
        <o:UsernameToken u:Id="uuid-72ea0c0a-43aa-43b2-bed7-c2da13624105-1">
            <o:Username>blablabla</o:Username>
            <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">blablabla</o:Password>
        </o:UsernameToken>
    </o:Security>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <HeartbeatRequest xmlns="http://removed">
        <DateTime xmlns="">8/23/2010 4:48:51 PM</DateTime>
        <Message xmlns="">123</Message>
    </HeartbeatRequest>
</s:Body>
Run Code Online (Sandbox Code Playgroud)

现在,这是我回复的回应.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
    <Misunderstood qname="o:Security" xmlns="http://www.w3.org/2002/06/soap-faults" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" />
</soapenv:Header>
<soapenv:Body>
    <soapenv:Fault xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <faultcode>soapenv:MustUnderstand</faultcode>
        <faultstring>WSWS3173E: Error: Did not understand &quot;MustUnderstand&quot; header(s):{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security</faultstring>
    </soapenv:Fault>
</soapenv:Body>
Run Code Online (Sandbox Code Playgroud)

注意关于MustUnderstand的部分没有被理解.

此服务的所有者已指出它们允许具有WSSE名称空间前缀但实际上不在XSD中的元素,并执行一些其他处理以阻止它们接受MustUnderstand ="1",因此我必须找到一种方法使用MustUnderstand ="0"发送消息.

我尝试使用MessageHeader属性在MessageContract中为代理客户端更改此项,但这没有帮助.

接下来,我实现了一个自定义客户端消息检查器.我为每个MSDN创建了一个自定义行为扩展元素和一个IEndpointBehavior的类,这些都是微不足道的,但这里是为了完整性:

    public class ExClientBehavior : IEndpointBehavior
{
    #region IEndpointBehavior Members

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection …
Run Code Online (Sandbox Code Playgroud)

.net c# wcf soap web-services

7
推荐指数
1
解决办法
2万
查看次数

标签 统计

.net ×1

c# ×1

soap ×1

wcf ×1

web-services ×1