C#WCF修改SOAP标头

时间:2016-10-18 08:25:34

标签: c# web-services wcf c#-4.0 soap

我有来自客户端的以下SOAP请求。

<e:Envelope xmlns:e="http://schemas.xmlsoap.org/soap/envelope/">
    <e:Header>
        <me:RequestHead xmlns:me="http://www.my-namespace.org/header/abc" >
            <ID>0</ID>
            <Green>
                <a>101</a>
                <b>0</b>
            </Green>
            <Time>1</Tim>
        </me:RequestHead>
    </e:Header>
    <e:Body>
        <m:RequestBody xmlns:m="http://www.my-namespace.org/service/abc">
            <Time>
                <hh>23</hh>
                <mm>59</mm>
                <ss>59</ss>
            </Time>            
        </m:RequestBody>
    </e:Body>
</e:Envelope>

在上面的请求中有RequestHead标记,我想在WCF反序列化请求之前将新的xmlns属性添加到RequestHead标记并转换为实际参数行动方法。

喜欢这样:

<e:Header>
    <me:RequestHead xmlns:me="http://www.my-namespace.org/header/abc" xmlns="http://www.my-namespace.org/header/abc" >
        <ID>0</ID>
        <Green>
            <a>101</a>
            <b>0</b>
        </Green>
        <Time>1</Tim>
    </me:RequestHead>
</e:Header>

因此我完成了以下工作。

首先,我实现了 IDispatchMessageFormatter 接口,因此我们可以在WCF将其反序列化为action方法的实际参数之前自定义SOAP信封。

public void DeserializeRequest(Message message, object[] parameters)
{
    message = new RequestMessage(message);
    this.objMessageFormatter.DeserializeRequest(message, parameters);
}

其次,我创建了我的自定义消息类,它扩展了Message类,我在其中覆盖了OnWriteStartHeaders方法,我试图将xmlns属性添加到{ {1}}标记。

RequestHead

但是这并没有将protected override void OnWriteStartHeaders(XmlDictionaryWriter writer) { base.OnWriteStartHeaders(writer); writer.WriteXmlnsAttribute("Header", "http://www.my-namespace.org/header/abc"); } 属性添加到xmlns,而是将RequestHead属性添加到xmlns标记。

实际输出:

Header

需要输出:

<e:Header xmlns="http://www.my-namespace.org/header/abc">
    <me:RequestHead xmlns:me="http://www.my-namespace.org/header/abc" >
        <ID>0</ID>
        <Green>
            <a>101</a>
            <b>0</b>
        </Green>
        <Time>1</Tim>
    </me:RequestHead>
</e:Header>

问题;

  • 那么有什么办法可以将xmlns属性添加到R​​equestHead标签中吗?
  • 或者我们可以获取Header标记的子标记并使用XmlDictionaryWriter修改它?

0 个答案:

没有答案