2012-04-30 11 views
7

Ist es möglich, Header auf einem WebChannelFactory zu setzen? Wenn ich ein WebClient Objekt verwendet hatte, kann ich so etwas tun:WebChannelFactory & Headers?

WebClient client = new WebClient(); 
client.Headers.Add("referer", "http://stackoverflow.com"); 
client.Headers.Add("user-agent", "Mozilla/5.0"); 

Aber ich habe nicht einen Weg, um herauszufinden, um die Header auf einem WebChannelFactory ändern kann.

Antwort

10

Die Klasse WebChannelFactory selbst nimmt keine HTTP-Header, aber Sie können sie zum aktuellen WebOperationContext hinzufügen, vorausgesetzt, Sie erstellen einen neuen Bereich, an dem sie arbeiten können - siehe unten.

WebChannelFactory<ICalculator> factory = new WebChannelFactory<ICalculator>(new Uri(baseAddress)); 
ICalculator proxy = factory.CreateChannel(); 
using (new OperationContextScope((IContextChannel)proxy)) 
{ 
    WebOperationContext.Current.OutgoingRequest.Headers.Add("referer", "http://stackoverflow.com"); 
    WebOperationContext.Current.OutgoingRequest.Headers.Add("user-agent", "Mozilla/5.0"); 
    Console.WriteLine("Add: {0}", proxy.Add(33, 55)); 
    Console.WriteLine(); 
} 

using (new OperationContextScope((IContextChannel)proxy)) 
{ 
    WebOperationContext.Current.OutgoingRequest.Headers.Add("referer", "http://stackoverflow.com"); 
    WebOperationContext.Current.OutgoingRequest.Headers.Add("user-agent", "Mozilla/5.0"); 
    Console.WriteLine("Subtract: {0}", proxy.Subtract(44, 33)); 
    Console.WriteLine(); 
} 

Dies funktioniert, aber es ist ziemlich ausführliche - Sie im Wesentlichen einen neuen Bereich für jeden Anruf erstellen müssen, wenn Sie abgehende Header es hinzufügen möchten.

Eine andere Option besteht darin, den Client in eine Clientklasse zu verpacken, um das Hinzufügen von Bereichen und Kopfzeilen für Sie durchzuführen. Die Verwendung einer von ClientBase<T> abgeleiteten Klasse ist eine einfache Möglichkeit, dies zu tun. Der folgende Code ist das vollständige Beispiel für diese Frage, mit beiden Optionen (mit dem Bereich direkt, mit Client-Basis abgeleitete Klasse) zum Hinzufügen von HTTP-Headern in Anforderungen von Proxys erstellt von WebChannelFactory.

public class StackOverflow_10388746 
{ 
    [ServiceContract] 
    public interface ICalculator 
    { 
     [WebGet] 
     int Add(int x, int y); 
     [WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)] 
     int Subtract(int x, int y); 
    } 
    public class Service : ICalculator 
    { 
     public int Add(int x, int y) 
     { 
      PrintHeaders("Add"); 
      return x + y; 
     } 
     public int Subtract(int x, int y) 
     { 
      PrintHeaders("Subtract"); 
      return x - y; 
     } 
     void PrintHeaders(string operation) 
     { 
      Console.WriteLine("Incoming HTTP headers for operation '{0}'", operation); 
      foreach (var header in WebOperationContext.Current.IncomingRequest.Headers.AllKeys) 
      { 
       Console.WriteLine(" {0}: {1}", header, WebOperationContext.Current.IncomingRequest.Headers[header]); 
      } 
     } 
    } 
    public class MyWebClient : ClientBase<ICalculator>, ICalculator 
    { 
     Dictionary<string, string> outgoingHeaders = new Dictionary<string, string>(); 

     public MyWebClient(Uri baseAddress) 
      : base(new WebHttpBinding(), new EndpointAddress(baseAddress)) 
     { 
      this.Endpoint.Behaviors.Add(new WebHttpBehavior()); 
     } 

     #region ICalculator Members 

     public int Add(int x, int y) 
     { 
      using (new OperationContextScope(this.InnerChannel)) 
      { 
       foreach (var headerName in this.outgoingHeaders.Keys) 
       { 
        WebOperationContext.Current.OutgoingRequest.Headers.Add(headerName, this.outgoingHeaders[headerName]); 
       } 

       this.outgoingHeaders.Clear(); 
       return this.Channel.Add(x, y); 
      } 
     } 

     public int Subtract(int x, int y) 
     { 
      using (new OperationContextScope(this.InnerChannel)) 
      { 
       foreach (var headerName in this.outgoingHeaders.Keys) 
       { 
        WebOperationContext.Current.OutgoingRequest.Headers.Add(headerName, this.outgoingHeaders[headerName]); 
       } 

       this.outgoingHeaders.Clear(); 
       return this.Channel.Subtract(x, y); 
      } 
     } 

     #endregion 

     public void AddOutgoingHeader(string name, string value) 
     { 
      this.outgoingHeaders.Add(name, value); 
     } 
    } 

    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     WebChannelFactory<ICalculator> factory = new WebChannelFactory<ICalculator>(new Uri(baseAddress)); 
     ICalculator proxy = factory.CreateChannel(); 
     using (new OperationContextScope((IContextChannel)proxy)) 
     { 
      WebOperationContext.Current.OutgoingRequest.Headers.Add("referer", "http://stackoverflow.com"); 
      WebOperationContext.Current.OutgoingRequest.Headers.Add("user-agent", "Mozilla/5.0"); 
      Console.WriteLine("Add: {0}", proxy.Add(33, 55)); 
      Console.WriteLine(); 
     } 

     using (new OperationContextScope((IContextChannel)proxy)) 
     { 
      WebOperationContext.Current.OutgoingRequest.Headers.Add("referer", "http://stackoverflow.com"); 
      WebOperationContext.Current.OutgoingRequest.Headers.Add("user-agent", "Mozilla/5.0"); 
      Console.WriteLine("Subtract: {0}", proxy.Subtract(44, 33)); 
      Console.WriteLine(); 
     } 

     MyWebClient client = new MyWebClient(new Uri(baseAddress)); 
     client.AddOutgoingHeader("referer", "http://stackoverflow.com"); 
     client.AddOutgoingHeader("user-agent", "Mozilla/5.0"); 
     Console.WriteLine("Add (via client): {0}", client.Add(44, 77)); 
     Console.WriteLine(); 

     client.AddOutgoingHeader("referer", "http://stackoverflow.com/another"); 
     client.AddOutgoingHeader("user-agent", "Mozilla/5.0-b"); 
     Console.WriteLine("Add (via client): {0}", client.Subtract(44, 77)); 
     Console.WriteLine(); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
+0

Große Antwort! Vielen Dank! – Kyle