2014-03-26 5 views
0

У меня есть служба WCF, построенная на классах, созданных из WSDL, поставляемого клиентом. К сожалению, этот WSDL не содержит требуемого заголовка сообщения. Клиент не будет поставлять новый WSDL, включая заголовок. У меня есть файл xsd, описывающий заголовок.Ввод заголовка в исходящее сообщение WCF

У меня также есть образец заголовка и знаю, какие поля мне нужно заполнить.

Как я могу взять предоставленный заголовок 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

Посмотрите здесь: http://stackoverflow.com/questions/964433/how-to-add-a-custom-header-to-every-wcf-call – Donal

+0

Это это то, что я ищу. Но в этом случае у меня есть очень специфическая структура заголовка, определенная вне WCF, и это будет очень сложно моделировать. Я просто хочу взять фрагмент заголовка XML и вставить его в сообщение. – user3081814

ответ

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)); 

Вероятно, наиболее важная вещь, чтобы заметить, что это добавление этого переменного заголовка к OutgoingMessageProperties в «Current» OperationContext используемой моего клиентом.

+0

Это могло бы помочь. У вас есть более полный пример, на который я мог бы обратить внимание. Мне нужно будет увидеть, как подключить это приложение. – user3081814

+0

Собственно, то, что вы видите, есть то, что я использую. Мне нужно только это для элемента User-Agent, который я добавляю. Но я уверен, что вы можете экстраполировать это, чтобы разместить любое количество необходимых заголовков, которые, по вашему мнению, отсутствуют из вашего запроса. – Brian

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 
} 
Смежные вопросы