2012-08-06 61 views
5

我在C#.NET Framework 3.5中一个简单的Web客户端调用像这样的SOAP服务的HelloWorld:增加头部到.NET 3.5 WCF客户

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

我使用一些中间件,增加了基本安全通过请求Authorization Header:“Authorization = Bearer 123456abcd”,它与REST服务一起工作,但我想要使用上述.Net客户端的服务...

如何将标题添加到Service Call ? 确实存在类似的东西:myservice.addHeader("authorization=blah");

+0

你创建一个 “添加服务引用” 客户端? – 2012-08-06 21:17:59

+0

是的,当我不使用中间件时,客户端工作。中间件增加了安全性,并希望标题进行验证 – nuvio 2012-08-06 21:19:49

+0

我总是讨厌那种中间件。它假设一切都是手动完成的,并没有考虑WSDL之类的东西,并且生成了代码。 – 2012-08-06 21:22:08

回答

5

您应该使用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(); 
     } 

授权

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

有没有办法在全球范围内做到这一点,比如对于大多数操作? – 2012-08-06 22:06:58

+0

由于*需要与OperationContextScope *一起使用,因此它只能通过抽象,例如在* Func <> *上更改服务调用 – GSerjo 2012-08-06 22:19:11