Is it possible to set headers on a WebChannelFactory
? If I were using a WebClient
object, I could do something like this:
WebClient client = new WebClient();
client.Headers.Add("referer", "http://stackoverflow.com");
client.Headers.Add("user-agent", "Mozilla/5.0");
But I haven't been able to figure out a way to modify the headers on a WebChannelFactory
.
The WebChannelFactory
class itself doesn't take any HTTP headers, but you can add them to the current WebOperationContext
given that you create a new scope for it to work on - see below.
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();
}
This works, but it's fairly verbose - you essentially need to create a new scope for each call if you want to add outgoing headers to it.
Another option is to wrap the client in a client class to do the scoping and header adding for you. Using a class derived from ClientBase<T>
is an easy way to do that. The code below is the complete sample for this question, with both options (using scope directly, using client base-derived class) for adding HTTP headers in requests from proxies created by 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();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With