I am really glad to know that it help some of you. However, I have received some queries from readers for implementing custom headers with Silverlight client which I am going to discuss in this post.
While working on Silverlight client, we have limited framework available and to implement custom headers there are some slight changes:
- Instead of App.config or Web.config, you have ServiceReference.ClientConfig
- MessageHeader (Generic) class is not available instead you can use MessageHeader class
- There is no BehaviorExtensionElement class available in Silverlight 4 Runtime
- Since there is no BehaviorExtensionElement class, therefore you cannot define extension in .config file
- You need to programmatically bind/add custom endpoint behavior
I have pasted the code snippet below, that would work fine with Silverlight 4 client to pass custom header to WCF service.
IClientMessageInspector
1: public class MyMessageInspector : IClientMessageInspector
2: {
3: #region IClientMessageInspector Members
4:
5: public void AfterReceiveReply(ref Message reply,
6: object correlationState)
7: {
8: Debug.WriteLine("SOAP Response: {0}", reply.ToString());
9: }
10:
11: public object BeforeSendRequest(ref Message request,
12: IClientChannel channel)
13: {
14: const string STR_Customer_Unique_Id = "Customer Unique Id: 12345";
15: var header = MessageHeader.CreateHeader("Identity",
16: "http://www.adilmughal.com",
17: STR_Customer_Unique_Id);
18: request.Headers.Add(header);
19: Debug.WriteLine("SOAP Request: {0}", request.ToString());
20: return null;
21: }
22: #endregion
23: }
Note that the header is now created (see line 15) using simple MessageHeader class.
IEndPointBehavior
1: public class CustomBehavior : IEndpointBehavior
2: {
3: #region IEndpointBehavior Members
4:
5: public void AddBindingParameters(ServiceEndpoint endpoint,
6: BindingParameterCollection bindingParameters)
7: {
8: }
9:
10: public void ApplyClientBehavior(ServiceEndpoint endpoint,
11: ClientRuntime clientRuntime)
12: {
13: clientRuntime.MessageInspectors.Add(new MyMessageInspector());
14: }
15:
16: public void ApplyDispatchBehavior(ServiceEndpoint endpoint,
17: EndpointDispatcher endpointDispatcher)
18: {
19: }
20:
21: public void Validate(
22: ServiceEndpoint endpoint)
23: {
24: }
25: #endregion
26: }
You may have observed that in contrast to previously discussed solution in last post, we are not implementing BehaviorExtensionElement any more.
Adding Behavior to Proxy
ServiceProxy.TestServiceClient proxy = new ServiceProxy.TestServiceClient();
proxy.Endpoint.Behaviors.Add(new CustomBehavior());
Without BehaviorExtensionElement, we cannot define custom endpoint behavior in .config file so need to plug it programmatically.
That is all. You may download code sample-LINK TO CODE. Hope this helps. If you have somewhat different solution, please do share.