2012-08-06 17 views
5

Tengo un cliente web sencillo en C# .Net Framework 3.5 que llama a un servicio SOAP HelloWorld como esto:Adición de cabecera a .NET 3.5 WCF Client

HelloService myservice = new HelloService(); 
string result = myservice.HelloWorld(); 

estoy usando algún medio-ware que añade seguridad básica pidiendo un encabezado de autorización: "Authorization = Bearer 123456abcd" que funciona con un servicio REST, pero quería consumir el servicio con el cliente .Net anterior ...

¿Cómo puedo agregar el encabezado a la llamada de servicio? ? ¿Existe algo como: myservice.addHeader("authorization=blah");?

+0

¿Ha creado al cliente con "Agregar referencia de servicio"? –

+0

sí, los clientes funcionan cuando no uso middleware. El middleware agrega seguridad y quiere que el Encabezado se autentique. – nuvio

+0

Siempre odio ese tipo de middleware. Asume que todo se hace de forma manual, y no tiene en cuenta cosas como un WSDL y que se genere el código. –

Respuesta

5

Debe utilizar OperationContextScope

using (OperationContextScope scope = new OperationContextScope(wcfClient.InnerChannel)) 
     { 
     MessageHeader header 
      = MessageHeader.CreateHeader(
      "Service-Bound-CustomHeader", 
      "http://Microsoft.WCF.Documentation", 
      "Custom Happy Value." 
     ); 
     OperationContext.Current.OutgoingMessageHeaders.Add(header); 

     // Making calls. 
     Console.WriteLine("Enter the greeting to send: "); 
     string greeting = Console.ReadLine(); 

     //Console.ReadLine(); 
     header = MessageHeader.CreateHeader(
      "Service-Bound-OneWayHeader", 
      "http://Microsoft.WCF.Documentation", 
      "Different Happy Value." 
     ); 
     OperationContext.Current.OutgoingMessageHeaders.Add(header); 

     // One-way 
     wcfClient.Push(greeting); 
     this.wait.WaitOne(); 

     // Done with service. 
     wcfClient.Close(); 
     Console.WriteLine("Done!"); 
     Console.ReadLine(); 
     } 

de autorización

var messageProperty = new HttpRequestMessageProperty(); 
messageProperty.Headers.Add(HttpRequestHeader.Authorization, AuthorizationHeader); 
+0

¿Hay alguna manera de hacer esto de manera más global, como, para la mayoría de las operaciones? –

+0

Dado que * se requiere el uso con OperationContextScope *, por lo que solo puede atravesar la abstracción, es decir, cambiar la llamada de servicio en * Func <> * por ejemplo – GSerjo