Presentation is loading. Please wait.

Presentation is loading. Please wait.

WCF Extensibility Scott Reed Owner - Brain Hz Software Instructor – DevelopMentor

Similar presentations


Presentation on theme: "WCF Extensibility Scott Reed Owner - Brain Hz Software Instructor – DevelopMentor"— Presentation transcript:

1 WCF Extensibility Scott Reed Owner - Brain Hz Software scott@brainhzsoftware.com Instructor – DevelopMentor scottr@develop.com

2 WCF Design Goal To be the single best way of getting any two pieces of software to communicate under any circumstances (assuming at least one is.NET)

3 Extensibility in a nutshell WCF doesn’t support everything out of the box When a limitation is reached WCF can still be used by adding or replacing a specific piece of the framework (Almost) everything can be extended Infinitely flexible = more difficult than it needs to be

4 BCA BCA BCA BCA BCA ClientService

5 Client Runtime Channel Transport Channel byte[] Dispatcher Runtime Client Code parameters Encoder Service Type parameters Channel Transport Channel byte[] Encoder Service Model Layer Channel Layer

6 ServiceHost ChannelDispatcher EndpointDispatcher DispatchRuntime DispatchOperation ChannelStack IChannel (Protocol) IChannel (Transport)

7 Behavior extensibility steps 1) Implement the functionality – MessageInspector, ErrorHandler, InstanceProvider, etc. 2) Hook up the functionality through behavior – ServiceBehavior, EndpointBehavior, OperationBehavior 3) Let WCF know about the behavior from #2 – Programmatically, configuratively, declaratively

8 When Behaviors Run 1. Reflect Over T 2. Load Config.Description.Open(); ServiceHost() or ChannelFactory() 3. Build Runtime 4. Open Resources Behaviors [MyBehavior].Description.Behaviors.Add(new MyBehavior());

9 Three Behaviors All three behavior types have the same methods: public void AddBindingParameters(, BindingParameterCollection); public void ApplyClientBehavior(, );* public void ApplyDispatchBehavior(, ); public void Validate( ); * ApplyClientBehavior isn’t present in IServiceBahvior

10 ParameterInspectors public interface IParameterInspector { object BeforeCall(string operationName, object[] inputs); void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState); } Parameter Inspection Useful for consistent client and service side validation Client Operation Client Runtime Channel

11 public interface IClientMessageFormatter { Message SerializeRequest(MessageVersion messageVersion, object[] parameters); object DeserializeReply(Message message, object[] parameters); } Message Formatting Actually creates the message from parameters, and breaks apart the message into parameters and return value.Formatter Client Operation Client Runtime Channel

12 public interface IClientMessageInspector { object BeforeSendRequest(ref Message request, IClientChannel channel); void AfterReceiveReply(ref Message reply, object state); } Message Inspection The most useful, allows last minute manipulation of the message before being sent into the channel layer.MessageInspectors Client Operation Client Runtime Channel

13 Other client side extension points Via (sends to intermediaries) ChannelInitializers (manipulate channel stack) But the service has far more extensibility…

14 Demo Client side message inspector Adding a behavior extension element

15 Error Handling DispatchOperationDispatchRuntimeEndpointDispatcherChannelDispatcher public interface IErrorHandler { bool HandleError(Exception error); void ProvideFault(Exception error, MessageVersion version, ref Message fault); }ErrorHandlers Allows a central place to perform exception to fault message translation.

16 Address / Contract Filtering DispatchOperationDispatchRuntimeEndpointDispatcherChannelDispatcher public abstract class MessageFilter { IMessageFilterTable CreateFilterTable (); bool Match(Message message); }AddressFilterContractFilter Allows the messages to be matched to an appropriate dispatch runtime.

17 Providing InstanceContext DispatchOperationDispatchRuntimeEndpointDispatcherChannelDispatcher public interface IInstanceContextProvider { InstanceContext GetExistingInstanceContext(Message message, IContextChannel channel); void InitializeInstanceContext(InstanceContext instanceContext, Message message, IContextChannel channel); bool IsIdle(InstanceContext instanceContext); void NotifyIdle(InstanceContextIdleCallback callback, InstanceContext instanceContext);}InstanceContextProvider Allows special case instancing modes

18 Providing Instance DispatchOperationDispatchRuntimeEndpointDispatcherChannelDispatcher public interface IInstanceProvider { object GetInstance(InstanceContext instanceContext,Message message); void ReleaseInstance(InstanceContext instanceContext,object instance); }InstanceProvider Allows service object pooling

19 Message Inspection (again) DispatchOperationDispatchRuntimeEndpointDispatcherChannelDispatcher public interface IDispatchMessageInspector { object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext); void BeforeSendReply(ref Message reply, object correlationState); }MessageInspectors The most useful, allows manipulation of the message right after being received from the channel layer.

20 Operation Selection DispatchOperationDispatchRuntimeEndpointDispatcherChannelDispatcher public interface IDispatchOperationSelector { string SelectOperation(ref Message message); } public SynchronizedKeyedCollection Operations { get { } }OperationSelector Allows operation selection by something other than Action

21 Message Formatting (again) DispatchOperationDispatchRuntimeEndpointDispatcherChannelDispatcher public interface IDispatchMessageFormatter { void DeserializeRequest(Message message, object[] parameters); Message SerializeReply(MessageVersion messageVersion, object[] parameters, object result); }Formatter Actually creates the message from parameters, and breaks apart the message into parameters and return value.

22 Operation Invocation DispatchOperationDispatchRuntimeEndpointDispatcherChannelDispatcher public interface IOperationInvoker { object[] AllocateInputs(); object Invoke(object instance, object[] inputs, out object[] outs); IAsyncResult InvokeBegin(object instance, object[] inputs,...); object InvokeEnd(object instance, out object[] outputs,...); }Invoker Actually takes control of calling the service object.

23 Parameter Inspection (again) DispatchOperationDispatchRuntimeEndpointDispatcherChannelDispatcher public interface IParameterInspector { object BeforeCall(string operationName, object[] inputs); void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState); }ParameterInspectors Useful for consistent client and service side validation.

24 Other service extensibility points Extensions ChannelInitializers ServiceThrottle ExternalAuthorizationPolicies RoleProvider ServiceAuthorizationManager InputSessionShutdownHandlers InstanceContextInitializers FaultContractInfos CallContextInitializers Etc...

25 Demo Service side error handler

26 Channel Layer extensibility Easy ways: – Binding configuration – Programmatic binding manipulation – Custom bindings Hard way – Writing a protocol channel Really hard way – Writing a transport channel

27 Writing a Channel (Overview) To write a channel, you must – Write the channel itself Support the proper “shapes” – Input, Output, Duplex, Request, Reply, RequestContext Possibly provide asynchronous versions of all method – Write a ChannelFactory – Write a ChannelListener – Write a BindingElement

28 Extensibility Summary If possible stick with Service Model layer – There are tons of extension points – It’s not that hard to do If you have to write a channel – Plan on spending a couple of weeks


Download ppt "WCF Extensibility Scott Reed Owner - Brain Hz Software Instructor – DevelopMentor"

Similar presentations


Ads by Google