将标头注入WCF出站消息

时间:2014-03-26 12:28:48

标签: c# wcf inject

我有一个基于客户提供的WSDL创建的类的WCF服务。不幸的是,这个WSDL没有包含所需的消息头。客户端不会提供包含标头的新WSDL。我有一个描述标题的xsd文件。

我还有一个示例标题,知道我需要填充哪些字段。

如何获取此提供的头XML并将其注入到出站WCF方法调用中? 我想像现在这样调用我的服务方法,但我也希望新的头结构构成出站消息的一部分。

提前致谢。 任何和所有帮助将不胜感激。

以下是消息结构的示例: 我需要添加整个头结构。 WSDL包含的所有内容都是正文。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Header>
      <glob:requestHeader xmlns:glob="http://....">
         <timestamp>2013-11-14T05:17:41.793+02:00</timestamp>
         <traceMessageId>GUID</traceMessageId>
         <enterpriseTraceUUId>GUID</enterpriseTraceUUId>
         <contentType>TEXT/XML</contentType>
         <sender>
            <senderId>SENDER</senderId>
            <sourceSystem>001</sourceSystem>
            <sourceApplication>001</sourceApplication>
            <applicationSessionId>ABC</applicationSessionId>
            <sourceLocation>100</sourceLocation>
         </sender>
         <interfaceName/>
         <version>1111</version>
      </glob:requestHeader>
   </s:Header>
   <s:Body xmlns:xsi="http://.../XMLSchema-instance" xmlns:xsd="http://.../XMLSchema">
      <UserData xmlns="http://.../Base">
         <IdField>1005687</IdField>
         <UserInfo>
            <UserType>1</UserType>
            <UserStatus>Y</UserStatus>
         </UserInfo>
      </UserData>
   </s:Body>
</s:Envelope>

2 个答案:

答案 0 :(得分:1)

例如,我使用此功能将“User-Agent”添加到我的外发邮件的标题中,但我认为您可以根据自己的需要进行调整:

private void AddCustomHeader(System.ServiceModel.OperationContextScope scope)
{
    dynamic reqProp = new System.ServiceModel.Channels.HttpRequestMessageProperty();
    reqProp.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT; blah; blah; blah)");
    System.ServiceModel.OperationContext.Current.OutgoingMessageProperties(System.ServiceModel.Channels.HttpRequestMessageProperty.Name) = reqProp;
}

我从用于调用主机的客户端程序的构造函数中调用上面的函数。

 AddCustomHeader(new System.ServiceModel.OperationContextScope(base.InnerChannel));

可能最值得注意的是,它将此标头变量添加到我的客户端使用的“当前”OperationContext的OutgoingMessageProperties中。

答案 1 :(得分:0)

你试过这个吗?也取自这里:How to add a custom HTTP header to every WCF call?

using (OperationContextScope scope = new OperationContextScope((IContextChannel)channel))
{
    MessageHeader<string> header = new MessageHeader<string>("secret message");
    var untyped = header.GetUntypedHeader("Identity", "http://www.my-website.com");
    OperationContext.Current.OutgoingMessageHeaders.Add(untyped);

    // now make the WCF call within this using block
}