Download presentation
Presentation is loading. Please wait.
Published byCharles Trivitt Modified over 10 years ago
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
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.