2012-08-06 12 views
5

Ho un semplice client Web in C# .NET Framework 3.5 che chiama un servizio SOAP HelloWorld come questo:Aggiunta di intestazione per .NET 3.5 WCF client

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

Sto usando un po 'di middleware che aggiunge sicurezza di base chiedendo un'intestazione di autorizzazione: "Autorizzazione = portatore 123456abcd" che funziona con un servizio REST, ma volevo consumare il servizio con il client .Net sopra ...

Come posso aggiungere l'intestazione alla chiamata di servizio ? Esiste qualcosa come: myservice.addHeader("authorization=blah");?

+0

avete creato al cliente "Add Service Reference"? –

+0

sì, i client funzionano quando non utilizzo il middleware. Il middleware aggiunge sicurezza e vuole che l'intestazione si autentifichi – nuvio

+0

Odio sempre quel tipo di middleware. Presuppone che tutto sia fatto manualmente e non tiene conto di cose come un WSDL e che ha generato il codice. –

risposta

5

Si dovrebbe usare 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(); 
     } 

di autorizzazione

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

C'è un modo per farlo più globalmente, come, per la maggior parte delle operazioni? –

+0

Poiché * viene utilizzato con OperationContextScope * richiesto in modo che sia possibile solo attraverso l'astrazione, ovvero cambiare la chiamata di servizio su * Func <> * ad esempio – GSerjo