向WCF出站消息注入报头

本文关键字:注入 报头 消息 WCF | 更新日期: 2023-09-27 17:53:25

我有一个构建在从客户提供的WSDL创建的类上的WCF服务。不幸的是,此WSDL不包含所需的消息头。客户机将不提供包含报头的新WSDL。我有一个描述头文件的xsd文件。

我也有一个示例头,并知道我需要填充哪些字段。

我怎么能把这个提供的头XML和注入到出站WCF方法调用?我想像现在一样调用我的service方法,但我也想要新的报头结构成为出站消息的一部分。

提前感谢。我将不胜感激。

下面是一个消息结构的例子:我需要添加整个头部结构。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>

向WCF出站消息注入报头

我使用这个,例如,将"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));

可能要注意的最重要的事情是,它将这个头变量添加到我的客户端使用的"Current"OperationContext的OutgoingMessageProperties中。

你试过吗?也从这里采取:如何添加自定义HTTP头到每个WCF调用?

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
}