我有一个基于客户提供的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>
答案 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)
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
}