<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Bruce Zhang's Tech Blog</title><link>http://weblogs.asp.net/brucezhang/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Focus on the Extension of WCF Behavior</title><link>http://weblogs.asp.net/brucezhang/archive/2009/06/22/focus-on-the-extension-of-wcf-behavior.aspx</link><pubDate>Tue, 23 Jun 2009 03:05:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7132334</guid><dc:creator>brucezhang</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/brucezhang/rsscomments.aspx?PostID=7132334</wfw:commentRss><comments>http://weblogs.asp.net/brucezhang/archive/2009/06/22/focus-on-the-extension-of-wcf-behavior.aspx#comments</comments><description>&lt;div class="group" id="container"&gt;   &lt;div class="group" id="content"&gt;     &lt;div class="main"&gt;       &lt;div class="snap_preview"&gt;         &lt;p&gt;WCF provides the flexible and extensible architecture for the developer. The most common situation is to customize the extension of behavior. It is not complex, but some issues should be noticed. This article is prepare to discuss how to extend the behavior in WCF.&lt;/p&gt;          &lt;p&gt;On the service side, if we want to extend the behavior, we need to extend the &lt;strong&gt;DispatchRuntime&lt;/strong&gt; and &lt;strong&gt;DispatchOperation&lt;/strong&gt;. The points of extension include inspecting parameters, messages and invoker of operations. The corresponding interfaces are &lt;strong&gt;IParameterInspector &lt;span style="color: #ff6600"&gt;(&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: #ff6600"&gt;to inspect parameters&lt;strong&gt;)&lt;/strong&gt;&lt;/span&gt;, &lt;strong&gt;IDispatchMessageInspector&lt;/strong&gt;&lt;span style="color: #ff6600"&gt;(to inspect messages)&lt;/span&gt; and &lt;strong&gt;IOperationInvoker&lt;/strong&gt;&lt;span style="color: #ff6600"&gt;(to invoke the operation)&lt;/span&gt;. On the client side, we should extend the &lt;strong&gt;ClientRuntime&lt;/strong&gt; and &lt;strong&gt;ClientOperation, &lt;/strong&gt;and the points of extension include inspecting parameters and messages. The corresponding interfaces are &lt;strong&gt;IParameterInspector&lt;/strong&gt; and &lt;strong&gt;IClientMessageInspector&lt;/strong&gt;. All interfaces are placed in System.ServiceModel.Dispatcher namespace. Note please that &lt;strong&gt;IParameterInspector can be applied both service side and client side&lt;/strong&gt;.&lt;/p&gt;          &lt;p&gt;It seems like implementation of &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;AOP&lt;/a&gt; (Aspect Oriented Programming) to implement these interfaces. We can inject some additional logic before and after invoking the related methods, so we call these extensions “Listener”. For example, There are some methods in IParameterInspector interface as below:&lt;/p&gt;          &lt;div style="font-size: 10pt; background: white; color: black"&gt;           &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;void&lt;/span&gt; AfterCall(&lt;span style="color: blue"&gt;string&lt;/span&gt; operationName, &lt;span style="color: blue"&gt;object&lt;/span&gt;[] outputs, &lt;span style="color: blue"&gt;object&lt;/span&gt; returnValue, &lt;span style="color: blue"&gt;object&lt;/span&gt; correlationState);&lt;/p&gt;            &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;object&lt;/span&gt; BeforeCall(&lt;span style="color: blue"&gt;string&lt;/span&gt; operationName, &lt;span style="color: blue"&gt;object&lt;/span&gt;[] inputs);&lt;/p&gt;            &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;            &lt;p style="margin: 0px"&gt;BeforeCall() method will be invoked before we invoke the target method of the service object, and AfterCall() method will be occured after the target method is invoked. For instance, we can validate if the value of parameter is less than zero before the method is invoked. If yes, it will throw an exception:&lt;/p&gt;            &lt;div style="font-size: 10pt; background: white; color: black"&gt;             &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CalculatorParameterInspector&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IParameterInspector&lt;/span&gt;&lt;/p&gt;              &lt;p style="margin: 0px"&gt;{&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; BeforeCall(&lt;span style="color: blue"&gt;string&lt;/span&gt; operationName, &lt;span style="color: blue"&gt;object&lt;/span&gt;[] inputs)&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;int&lt;/span&gt; x = inputs[0] &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt;;&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;int&lt;/span&gt; y = inputs[1] &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt;;&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (x &amp;lt; 0 || y &amp;lt; 0)&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;FaultException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;“The number can not be less than zero.”&lt;/span&gt;);&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; AfterCall(&lt;span style="color: blue"&gt;string&lt;/span&gt; operationName, &lt;span style="color: blue"&gt;object&lt;/span&gt;[] outputs, &lt;span style="color: blue"&gt;object&lt;/span&gt; returnValue, &lt;span style="color: blue"&gt;object&lt;/span&gt; correlationState)&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;//empty;&lt;/span&gt;&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;              &lt;p style="margin: 0px"&gt;}&lt;/p&gt;              &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;              &lt;p style="margin: 0px"&gt;It distinguishs between the service and client side to inspect the parameter, and the methods of interface are quite converse to the order of messaging(Note: IDispatchMessageInspector interface includes BeforeSendReply() and AfterReceiveRequest(); and IClientMessageInspector interface includes BeforeSendRequest() and AfterReceiveReply()). We might handle the message through by the methods of this interface, for example, printing the message header:&lt;/p&gt;              &lt;div style="font-size: 10pt; background: white; color: black"&gt;               &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PrintMessageInterceptor&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IDispatchMessageInspector&lt;/span&gt;&lt;/p&gt;                &lt;p style="margin: 0px"&gt;{&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IDispatchMessageInspector Members&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;object&lt;/span&gt; AfterReceiveRequest(&lt;span style="color: blue"&gt;ref&lt;/span&gt; System.ServiceModel.Channels.&lt;span style="color: #2b91af"&gt;Message&lt;/span&gt; request, &lt;span style="color: #2b91af"&gt;IClientChannel&lt;/span&gt; channel, &lt;span style="color: #2b91af"&gt;InstanceContext&lt;/span&gt; instanceContext)&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MessageBuffer buffer = request.CreateBufferedCopy(&lt;span style="color: #2b91af"&gt;Int32&lt;/span&gt;.MaxValue);&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; request = buffer.CreateMessage();&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;“After Receive Request:”&lt;/span&gt;);&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (MessageHeader header &lt;span style="color: blue"&gt;in&lt;/span&gt; request.Headers)&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(header);&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;(&lt;span style="color: #a31515"&gt;‘*’&lt;/span&gt;, 20));&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; BeforeSendReply(&lt;span style="color: blue"&gt;ref&lt;/span&gt; System.ServiceModel.Channels.&lt;span style="color: #2b91af"&gt;Message&lt;/span&gt; reply, &lt;span style="color: blue"&gt;object&lt;/span&gt; correlationState)&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MessageBuffer buffer = reply.CreateBufferedCopy(&lt;span style="color: #2b91af"&gt;Int32&lt;/span&gt;.MaxValue);&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; reply = buffer.CreateMessage();&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;“Before Send Request:”&lt;/span&gt;);&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (MessageHeader header &lt;span style="color: blue"&gt;in&lt;/span&gt; reply.Headers)&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(header);&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;(&lt;span style="color: #a31515"&gt;‘*’&lt;/span&gt;, 20));&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/p&gt;                &lt;p style="margin: 0px"&gt;}&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                &lt;p style="margin: 0px"&gt;There are four different kinds of behaviors including &lt;strong&gt;Service Behavior&lt;/strong&gt;, &lt;strong&gt;Endpoint Behavior&lt;/strong&gt;, &lt;strong&gt;Contract Behavior&lt;/strong&gt; and &lt;strong&gt;Operation Behavior&lt;/strong&gt;. Their corresponding interfaces are &lt;strong&gt;IServiceBehavior&lt;/strong&gt;, &lt;strong&gt;IEndpointBehavior&lt;/strong&gt;, &lt;strong&gt;IContractBehavior&lt;/strong&gt; and &lt;strong&gt;IOperationBehavior&lt;/strong&gt;. Although they are different interface by nature, but their methods are almost similar including: AddBindingParameters(), ApplyClientBehavior() and ApplyDispatchBehavior().&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&lt;strong&gt;Note: Because IServiceBehavior is only used on the service side, so it has no ApplyClientBehavior() method.&lt;/strong&gt;&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                &lt;p style="margin: 0px"&gt;We can customize our class to implement these interface, but some key elements should be underlined:&lt;/p&gt;                &lt;p style="margin: 0px"&gt;1. The scope of the behavior. Table 1 describes all situations:&lt;/p&gt;                &lt;table cellspacing="0" cellpadding="0" border="1"&gt;&lt;tbody&gt;                   &lt;tr&gt;                     &lt;td width="90" rowspan="2"&gt;                       &lt;p align="center"&gt;Behavior Type&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="126" rowspan="2"&gt;                       &lt;p align="center"&gt;Interface&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="302" colspan="4"&gt;                       &lt;p align="center"&gt;Scope&lt;/p&gt;                     &lt;/td&gt;                   &lt;/tr&gt;                    &lt;tr&gt;                     &lt;td width="66"&gt;                       &lt;p align="center"&gt;Service&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="76"&gt;                       &lt;p align="center"&gt;Endpoint&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="85"&gt;                       &lt;p align="center"&gt;Contract&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="76"&gt;                       &lt;p align="center"&gt;Operation&lt;/p&gt;                     &lt;/td&gt;                   &lt;/tr&gt;                    &lt;tr&gt;                     &lt;td width="90"&gt;                       &lt;p align="center"&gt;Service&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="126"&gt;                       &lt;p align="center"&gt;IServiceBehavior&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="66"&gt;                       &lt;p align="center"&gt;Y&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="76"&gt;                       &lt;p align="center"&gt;Y&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="85"&gt;                       &lt;p align="center"&gt;Y&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="76"&gt;                       &lt;p align="center"&gt;Y&lt;/p&gt;                     &lt;/td&gt;                   &lt;/tr&gt;                    &lt;tr&gt;                     &lt;td width="90"&gt;                       &lt;p align="center"&gt;Endpoint&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="126"&gt;                       &lt;p align="center"&gt;IEndpointBehavior&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="66"&gt;                       &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="76"&gt;                       &lt;p align="center"&gt;Y&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="85"&gt;                       &lt;p align="center"&gt;Y&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="76"&gt;                       &lt;p align="center"&gt;Y&lt;/p&gt;                     &lt;/td&gt;                   &lt;/tr&gt;                    &lt;tr&gt;                     &lt;td width="90"&gt;                       &lt;p align="center"&gt;Contract&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="126"&gt;                       &lt;p align="center"&gt;IContractBehavior&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="66"&gt;                       &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="76"&gt;                       &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="85"&gt;                       &lt;p align="center"&gt;Y&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="76"&gt;                       &lt;p align="center"&gt;Y&lt;/p&gt;                     &lt;/td&gt;                   &lt;/tr&gt;                    &lt;tr&gt;                     &lt;td width="90"&gt;                       &lt;p align="center"&gt;Operation&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="126"&gt;                       &lt;p align="center"&gt;IOperationBehavior&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="66"&gt;                       &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="76"&gt;                       &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="85"&gt;                       &lt;p align="center"&gt;&amp;#160;&lt;/p&gt;                     &lt;/td&gt;                      &lt;td width="76"&gt;                       &lt;p align="center"&gt;Y&lt;/p&gt;                     &lt;/td&gt;                   &lt;/tr&gt;                 &lt;/tbody&gt;&lt;/table&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                &lt;p style="margin: 0px"&gt;2. We can add the extension of service behavior, contract behavior and operation behavior by applying on custom attribute, but can not add the extension of endpoint behavior in this way.&amp;#160; We can add the extension of service behavior and endpoint behavior by using config file, but can not add the extension of contract behavior and operation behavior in this way. All behaviors can be added by ServiceDescription.&lt;/p&gt;                &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                &lt;p style="margin: 0px"&gt;To add the extended behavior by applying on custom attribute, we can let the custom behavior derived from Attribute class. Then we can apply it on service, contract or operation:&lt;/p&gt;                &lt;div style="font-size: 10pt; background: white; color: black; font-family: verdana"&gt;                 &lt;p style="margin: 0px"&gt;[&lt;span style="color: #2b91af"&gt;AttributeUsage&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;AttributeTargets&lt;/span&gt;.Class|&lt;span style="color: #2b91af"&gt;AttributeTargets&lt;/span&gt;.Interface)]&lt;/p&gt;                  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MyServiceBehavior&lt;/span&gt;:&lt;span style="color: #2b91af"&gt;Attribute&lt;/span&gt;, IServiceBehavior&lt;/p&gt;                  &lt;p style="margin: 0px"&gt;{}&lt;/p&gt;                  &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                  &lt;p style="margin: 0px"&gt;[&lt;span style="color: #2b91af"&gt;MyServiceBehavior&lt;/span&gt;]&lt;/p&gt;                  &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IService&lt;/span&gt;&lt;/p&gt;                  &lt;p style="margin: 0px"&gt;{ }&lt;/p&gt;                  &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                  &lt;p style="margin: 0px"&gt;If you want to add the extended behavior by using config file, you must define a class derived from BehaviorExtensionElement (It belongs to System.ServiceModel.Configuration namespace) class, then override the BehaviorType property and CreateBehavior() method. BehaviorType property returns the type of extended behavior, and CreateBehavior() is responsible for creating the instance of the extended behavior:&lt;/p&gt;                  &lt;div style="font-size: 10pt; background: white; color: black; font-family: verdana"&gt;                   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MyBehaviorExtensionElement&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;BehaviorExtensionElement&lt;/span&gt;&lt;/p&gt;                    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;                    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; MyBehaviorExtensionElement() { }&lt;/p&gt;                    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Type&lt;/span&gt; BehaviorType&lt;/p&gt;                    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(MyServiceBehavior); }&lt;/p&gt;                    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;object&lt;/span&gt; CreateBehavior()&lt;/p&gt;                    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; MyServiceBehavior();&lt;/p&gt;                    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;                    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                    &lt;p style="margin: 0px"&gt;If the element which should be configured add the new property, we must apply the ConfigurationPropertyAttribute on this new one:&lt;/p&gt;                    &lt;div style="font-size: 10pt; background: white; color: black; font-family: verdana"&gt;                     &lt;p style="margin: 0px"&gt;[&lt;span style="color: #2b91af"&gt;ConfigurationProperty&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;providerName&amp;quot;&lt;/span&gt;, IsRequired = &lt;span style="color: blue"&gt;true&lt;/span&gt;)]&lt;/p&gt;                      &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;virtual&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; ProviderName&lt;/p&gt;                      &lt;p style="margin: 0px"&gt;{&lt;/p&gt;                      &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;&lt;/p&gt;                      &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                      &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;[&lt;span style="color: #a31515"&gt;&amp;quot;ProviderName&amp;quot;&lt;/span&gt;] &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;;&lt;/p&gt;                      &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                      &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;set&lt;/span&gt;&lt;/p&gt;                      &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                      &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;[&lt;span style="color: #a31515"&gt;&amp;quot;ProviderName&amp;quot;&lt;/span&gt;] = &lt;span style="color: blue"&gt;value&lt;/span&gt;;&lt;/p&gt;                      &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                      &lt;p style="margin: 0px"&gt;}&lt;/p&gt;                      &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                      &lt;p style="margin: 0px"&gt;The detail of config file like this:&lt;/p&gt;                      &lt;div style="font-size: 10pt; background: white; color: black; font-family: verdana"&gt;                       &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;configuration&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;services&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;service&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;“&lt;span style="color: blue"&gt;MessageInspectorDemo.Calculator&lt;/span&gt;“&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;endpoint&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;behaviorConfiguration&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;“&lt;span style="color: blue"&gt;&lt;strong&gt;messageInspectorBehavior&lt;/strong&gt;&lt;/span&gt;“&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: red"&gt;address&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;“&lt;span style="color: blue"&gt;http://localhost:801/Calculator&lt;/span&gt;“&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: red"&gt;binding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;“&lt;span style="color: blue"&gt;basicHttpBinding&lt;/span&gt;“&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: red"&gt;contract&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;“&lt;span style="color: blue"&gt;MessageInspectorDemo.ICalculator&lt;/span&gt;“&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;service&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;services&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;behaviors&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;behavior&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;“&lt;span style="color: blue"&gt;messageInspectorBehavior&lt;/span&gt;“&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;myBehaviorExtensionElement&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;&lt;strong&gt;providerName&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;“&lt;span style="color: blue"&gt;Test&lt;/span&gt;“&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;behavior&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;serviceBehaviors&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;behaviors&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;extensions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;behaviorExtensions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;“&lt;span style="color: blue"&gt;myBehaviorExtensionElement&lt;/span&gt;“&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;“&lt;span style="color: blue"&gt;&lt;strong&gt;MessageInspectorDemo.MyBehaviorExtensionElement, &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MessageInspectorDemo, &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Version=1.0.0.0, &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Culture=neutral, &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PublicKeyToken=null&lt;/strong&gt;&lt;/span&gt;“&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;behaviorExtensions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;extensions&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;configuration&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&lt;span style="color: #000000"&gt;Please notes the contents which font are bold. &amp;lt;myBehaviorExtensionElement&amp;gt; is our extended behavior, and providerName&lt;/span&gt; is the new property of MyBehaviorExtensionElement. If you extended IEndpointBehavior, &amp;lt;serviceBehaviors&amp;gt; section should be replaced with &amp;lt;endpointBehaviors&amp;gt;. The extensions of custom behaviors will be placed in the &amp;lt;extensions&amp;gt;&amp;lt;/extensions&amp;gt; section. The value of name attribute must match the configuration of &amp;lt;behavior&amp;gt; section, both are “myBehaviorExtensionElement”.&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;The value of type inside the &amp;lt;behaviorExtensions&amp;gt; section you want to add must be the full name of type. The first part of the full name is the full type name, and the second part of the name is the namespace. Version, Culture and PublicKeyToken are also indispensable elements. The string of type name use the comma as a splitter. &lt;span style="color: #ff6600"&gt;&lt;strong&gt;After the comma, it must left a space&lt;/strong&gt;&lt;/span&gt;, otherwise we can not add the configuration of extended behavior normally. Why does it give the awful constraint here? Because the value is prepared for reflect technology. I agree that it is a defect. I hope microsoft will solve this problem in the next release of WCF.&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                        &lt;p style="margin: 0px"&gt;3. In the body of related methods, we need to add the extensions of checking parameters, messages and operation invoker. The relationship between the extension of them exists here. For checking parameters, the logic of extensions might be added in ApplyClientBehavior() and ApplyDispatchBehavior() of IOperationBehavior interface. For example, we can define a CalculatorParameterValidation class for CalculatorParameterInspector:&lt;/p&gt;                        &lt;div style="font-size: 10pt; background: white; color: black; font-family: verdana"&gt;                         &lt;div style="font-size: 10pt; background: white; color: black; font-family: verdana"&gt;                           &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CalculatorParameterValidation&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;Attribute&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;IOperationBehavior&lt;/span&gt;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;{&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IOperationBehavior Members&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; AddBindingParameters(&lt;span style="color: #2b91af"&gt;OperationDescription&lt;/span&gt; operationDescription,&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BindingParameterCollection bindingParameters)&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ApplyClientBehavior(&lt;span style="color: #2b91af"&gt;OperationDescription&lt;/span&gt; operationDescription,&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;ClientOperation&lt;/span&gt; clientOperation)&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;CalculatorParameterInspector&lt;/span&gt; inspector = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CalculatorParameterInspector&lt;/span&gt;();&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; clientOperation.ParameterInspectors.Add(inspector);&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ApplyDispatchBehavior(&lt;span style="color: #2b91af"&gt;OperationDescription&lt;/span&gt; operationDescription,&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;DispatchOperation&lt;/span&gt; dispatchOperation)&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;CalculatorParameterInspector&lt;/span&gt; inspector = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CalculatorParameterInspector&lt;/span&gt;();&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dispatchOperation.ParameterInspectors.Add(inspector);&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Validate(&lt;span style="color: #2b91af"&gt;OperationDescription&lt;/span&gt; operationDescription)&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;}&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                         &lt;/div&gt;                          &lt;p style="margin: 0px"&gt;If it is not necessary to seperate the inspector from the extended behavior, a better solution is to let a custom class implement both IParameterInspector and IOperationBehavior. For example:&lt;/p&gt;                          &lt;div style="font-size: 10pt; background: white; color: black; font-family: verdana"&gt;                           &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CalculatorParameterValidation&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;Attribute&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;IParameterInspector&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;IOperationBehavior&lt;/span&gt;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;{&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IParameterInspector Members&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; BeforeCall(&lt;span style="color: blue"&gt;string&lt;/span&gt; operationName, &lt;span style="color: blue"&gt;object&lt;/span&gt;[] inputs)&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;int&lt;/span&gt; x = inputs[0] &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt;;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;int&lt;/span&gt; y = inputs[1] &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt;;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (x &amp;lt; 0 || y &amp;lt; 0)&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;FaultException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;“The number can not be less than zero.”&lt;/span&gt;);&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; AfterCall(&lt;span style="color: blue"&gt;string&lt;/span&gt; operationName, &lt;span style="color: blue"&gt;object&lt;/span&gt;[] outputs, &lt;span style="color: blue"&gt;object&lt;/span&gt; returnValue, &lt;span style="color: blue"&gt;object&lt;/span&gt; correlationState)&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;//empty;&lt;/span&gt;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IOperationBehavior Members&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; AddBindingParameters(&lt;span style="color: #2b91af"&gt;OperationDescription&lt;/span&gt; operationDescription,&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BindingParameterCollection bindingParameters)&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ApplyClientBehavior(&lt;span style="color: #2b91af"&gt;OperationDescription&lt;/span&gt; operationDescription,&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;ClientOperation&lt;/span&gt; clientOperation)&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="text-decoration: line-through"&gt;&lt;span style="color: #2b91af"&gt;CalculatorParameterInspector&lt;/span&gt; inspector = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CalculatorParameterInspector&lt;/span&gt;();&lt;/span&gt;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; clientOperation.ParameterInspectors.Add(&lt;span style="color: blue"&gt;this&lt;/span&gt;);&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ApplyDispatchBehavior(&lt;span style="color: #2b91af"&gt;OperationDescription&lt;/span&gt; operationDescription,&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;DispatchOperation&lt;/span&gt; dispatchOperation)&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="text-decoration: line-through"&gt;&lt;span style="color: #2b91af"&gt;CalculatorParameterInspector&lt;/span&gt; inspector = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CalculatorParameterInspector&lt;/span&gt;();&lt;/span&gt;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dispatchOperation.ParameterInspectors.Add(&lt;span style="color: blue"&gt;this&lt;/span&gt;);&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Validate(&lt;span style="color: #2b91af"&gt;OperationDescription&lt;/span&gt; operationDescription)&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;}&lt;/p&gt;                            &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                         &lt;/div&gt;                          &lt;p style="margin: 0px"&gt;While operation invoker is associated with IOperationBehavior, but in fact, it will do with Invoker property of DispatchOperation. Assume that we have defined a MyOperationInvoker class which implement the IOperationInvoker interface, the solution is:&lt;/p&gt;                          &lt;div style="font-size: 10pt; background: white; color: black; font-family: verdana"&gt;                           &lt;div style="font-size: 10pt; background: white; color: black; font-family: verdana"&gt;                             &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MyOperationInvoker&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IOperationInvoker&lt;/span&gt;&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;{&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;//some implementation&lt;/span&gt;&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;}&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MyOperationInvokerBehavior&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;Attribute&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;IOperationBehavior&lt;/span&gt;&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;{&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IOperationBehavior Members&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; AddBindingParameters(&lt;span style="color: #2b91af"&gt;OperationDescription&lt;/span&gt; operationDescription,&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BindingParameterCollection bindingParameters)&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ApplyClientBehavior(&lt;span style="color: #2b91af"&gt;OperationDescription&lt;/span&gt; operationDescription,&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;ClientOperation&lt;/span&gt; clientOperation)&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ApplyDispatchBehavior(&lt;span style="color: #2b91af"&gt;OperationDescription&lt;/span&gt; operationDescription,&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;DispatchOperation&lt;/span&gt; dispatchOperation)&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dispatchOperation.Invoker = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MyOperationInvoker&lt;/span&gt;(dispatchOperation.Invoker);&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Validate(&lt;span style="color: #2b91af"&gt;OperationDescription&lt;/span&gt; operationDescription)&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;}&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                              &lt;p style="margin: 0px"&gt;As far as message inspecting with Dispatch are concerned, we can add it using MessageInspectors property in DispatchRuntime owned by&amp;#160; IServiceBehavior, or IEndpointBehavior, or IContractBehavior. For message inspecting with Client, we can add in using MessageInspectors property in ClientRuntime owned by IEndpointBehavior or IContractBehavior(IServiceBehavior can not be used on the client side, so it’s not IServiceBehavior’s business). For example:&lt;/p&gt;                              &lt;div style="font-size: 10pt; background: white; color: black; font-family: verdana"&gt;                               &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PrintMessageInspectorBehavior&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IDispatchMessageInspector&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;IEndpointBehavior&lt;/span&gt;&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;{&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; IEndpointBehavior Members&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; AddBindingParameters(&lt;span style="color: #2b91af"&gt;ServiceEndpoint&lt;/span&gt; endpoint, BindingParameterCollection bindingParameters)&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;//empty;&lt;/span&gt;&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ApplyClientBehavior(&lt;span style="color: #2b91af"&gt;ServiceEndpoint&lt;/span&gt; endpoint, &lt;span style="color: #2b91af"&gt;ClientRuntime&lt;/span&gt; clientRuntime)&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;clientRuntime&lt;/strong&gt;.&lt;strong&gt;MessageInspectors&lt;/strong&gt;.Add(&lt;span style="color: blue"&gt;this&lt;/span&gt;);&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ApplyDispatchBehavior(&lt;span style="color: #2b91af"&gt;ServiceEndpoint&lt;/span&gt; endpoint, &lt;span style="color: #2b91af"&gt;EndpointDispatcher&lt;/span&gt; endpointDispatcher)&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; endpointDispatcher.&lt;strong&gt;DispatchRuntime&lt;/strong&gt;.&lt;strong&gt;MessageInspectors&lt;/strong&gt;.Add(&lt;span style="color: blue"&gt;this&lt;/span&gt;);&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Validate(&lt;span style="color: #2b91af"&gt;ServiceEndpoint&lt;/span&gt; endpoint)&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;//empty;&lt;/span&gt;&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;//The implemenation of DispatchMessageInspector; Omitted&lt;/span&gt;&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;}&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;                                &lt;p style="margin: 0px"&gt;If our behavior implement the IServiceBehavior, we must iterate the ServiceHostBase object in the ApplyDispatchBehavior() method:&lt;/p&gt;                                &lt;div style="font-size: 10pt; background: white; color: black; font-family: verdana"&gt;                                 &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ApplyDispatchBehavior(&lt;span style="color: #2b91af"&gt;ServiceDescription&lt;/span&gt; serviceDescription, &lt;span style="color: #2b91af"&gt;ServiceHostBase&lt;/span&gt; serviceHostBase)&lt;/p&gt;                                  &lt;p style="margin: 0px"&gt;{&lt;/p&gt;                                  &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;ChannelDispatcher&lt;/span&gt; channelDispatcher &lt;span style="color: blue"&gt;in&lt;/span&gt; serviceHostBase.ChannelDispatchers)&lt;/p&gt;                                  &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                                  &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;EndpointDispatcher&lt;/span&gt; endpointDispatcher &lt;span style="color: blue"&gt;in&lt;/span&gt; channelDispatcher.Endpoints)&lt;/p&gt;                                  &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;                                  &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; endpointDispatcher.DispatchRuntime.MessageInspectors.Add(&lt;span style="color: blue"&gt;this&lt;/span&gt;);&lt;/p&gt;                                  &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                                  &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;                                  &lt;p style="margin: 0px"&gt;}&lt;/p&gt;                                  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:53f863cb-afcc-46cc-8686-ebab12219ace" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati 标签: &lt;a href="http://technorati.com/tags/wcf" rel="tag"&gt;wcf&lt;/a&gt;&lt;/div&gt;                               &lt;/div&gt;                             &lt;/div&gt;                           &lt;/div&gt;                         &lt;/div&gt;                       &lt;/div&gt;                     &lt;/div&gt;                   &lt;/div&gt;                 &lt;/div&gt;               &lt;/div&gt;             &lt;/div&gt;           &lt;/div&gt;         &lt;/div&gt;       &lt;/div&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7132334" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/brucezhang/archive/tags/WCF/default.aspx">WCF</category></item><item><title>Stream operation in WCF</title><link>http://weblogs.asp.net/brucezhang/archive/2009/06/01/stream-operation-in-wcf.aspx</link><pubDate>Mon, 01 Jun 2009 12:40:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7105005</guid><dc:creator>brucezhang</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/brucezhang/rsscomments.aspx?PostID=7105005</wfw:commentRss><comments>http://weblogs.asp.net/brucezhang/archive/2009/06/01/stream-operation-in-wcf.aspx#comments</comments><description>&lt;p&gt;WCF provides the support for Stream object. It typically recommends the 
developer to handle the message which size is too large as Stream object for the 
sake of high performance.&lt;/p&gt;
&lt;p&gt;However, there are some constraints on Stream operation to note:&lt;br&gt;&lt;span style="font-weight: bold;"&gt;1. The 
constraint of Binding&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The valid bindings include BasicHttpBinding, NetTcpBinding and 
NetNamePipeBinding for Stream operation. In addition, we can’t use Reliable 
Messaging while handling the Stream object. If you are considering about the 
security of message, this way is not a good choice.&lt;/p&gt;
&lt;p style="font-weight: bold;"&gt;2. The constraint of Stream object&lt;/p&gt;
&lt;p&gt;The object, you want to transport as a parameter with WCF Operation, must be 
serializable. Unfortunately, FileStream class can’t be serialized. We have to 
use Stream, MemoryStream. The Stream class is the main option for handling a 
stream object.&lt;/p&gt;
&lt;p&gt;It is very interesting of transform between FileStream and Stream class. For 
example, the following implementation of the operation in&amp;nbsp;a service:&lt;br&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;Stream&amp;nbsp;TransferDocument(Document&amp;nbsp;document)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
FileStream&amp;nbsp;stream&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;FileStream&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
(document.LocalPath,&amp;nbsp;FileMode.Open,&amp;nbsp;FileAccess.Read);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;stream;&lt;br&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Note, the type of return value of TransferDocument() method is Stream. But 
the ture type should be FileStream. Due to FileStream is the subclass of Stream, 
so it is no problem according to polymorphism of OO. When the client want to 
invoke TransferDocument() method, we can’t assign the return value to FileStream 
object in fact:&lt;br&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;FileStream&amp;nbsp;stream&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;m_service.TransferDocument(doc);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The value of stream object is null now. So we must do like this:&lt;br&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Stream&amp;nbsp;stream&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;m_service.TransferDocument(doc);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It is strange that WCF can’t serialize the Length property of Stream object. 
On the client side, we can not use the Length property. If you want to do, it 
will throw a NotSupportedException.&lt;/p&gt;
&lt;p style="font-weight: bold;"&gt;3. The constraint of TransferMode&lt;/p&gt;
&lt;p&gt;The default value of TransferMode is setted to&amp;nbsp;Buffered. If you want to use 
Stream operation, you must change the default setting of TransferMode. We can 
set it to Streamed, StreamedRequest or StreamedResponse according to the 
different cases.&lt;/p&gt;
&lt;p style="font-weight: bold;"&gt;4. The constraint of MaxReceiveMessage&lt;/p&gt;
&lt;p&gt;The default value of MaxReceiveMessage property is 64kb. If the size of 
transported stream object exceeds the setting value of MaxReceiveMessage, It 
will throw a CommunicationException during the client invokes the operation of 
service to handle this stream object. So we should change the value depending on 
the specific situation. The value ranges from 1 to 9223372036854775807(i.e. 
Int32.MaxValue). If the setting value is outside the range, the program can not 
be compiled successfully. Set its value&amp;nbsp;in programmatic:&lt;br&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;binding.&lt;/span&gt;MaxReceivedMessageSize&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; 120000&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;And set it in administrative:&lt;br&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;binding&amp;nbsp;…… 
maxReceivedMessageSize&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;“&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;120000&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;“&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="font-weight: bold;"&gt;5. The constraint of Operation Parameters&lt;/p&gt;
&lt;p&gt;WCF applies the strict constraint on the parameters of operation including 
stream objects. There can be only one stream object as the parameter(in, out, 
ref parameter or return value) in the method signature. So these definitions of 
the method are all invalid as below:&lt;br&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;Transfer(Stream&amp;nbsp;s1,&amp;nbsp;Stream&amp;nbsp;s2);&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;Transfer(Stream&amp;nbsp;s1,&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;out&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;Stream&amp;nbsp;s2);&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;Transfer(Stream&amp;nbsp;s1,&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;ref&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;Stream&amp;nbsp;s2);&lt;br&gt;Stream&amp;nbsp;Transfer(Stream&amp;nbsp;stream);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you define the method like above, it will occur the run-time error.&lt;/p&gt;
&lt;p style="font-weight: bold;"&gt;6. The constraint of Instance Activation&lt;/p&gt;
&lt;p&gt;Because we can only use the BasicHttpBinding, NetTcpBinding or 
NetNamedPipeBinding in the stream operaiton, it will impact on the mode of 
instance activation, in particular Session mode. First, BasicHttpBinding doesn’t 
support Session mode. Secondly, although the other bindings(NetTcpBinding or 
NetNamedPipeBinding) support Session mode, we can’t set the value of 
ReliableSession to the true because the stream operation doesn’t support 
reliable messaging. So if you set the value of SessionMode to 
SessionMode.Required for the service, it will throw an exception.&lt;/p&gt;
&lt;p&gt;In fact, the stream operation(i.e. the value of TransferMode is not Buffered) 
itself doesn’t support Session mode. Even we set the value of SessionMode to 
Allowed, and set the value of InstanceContextMode to PerSession while using 
NetTcpBinding, the behavior of service is still PerCall mode. And the value of 
SessionId(get it through by OperationContext.Current.SessionId)&amp;nbsp;should be&amp;nbsp;null 
at this time.&lt;/p&gt;
&lt;p&gt;Finally, I recommend you increase the value of SendTimeOut property because 
the calling&amp;nbsp;a large&amp;nbsp;stream object will last too&amp;nbsp;long time. For example, set its 
value to 10 minutes in&amp;nbsp;programmatic:&lt;br&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;binding.SendTimeout&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;nbsp;TimeSpan.FromMinutes(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;10&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Or set it in administrative:&lt;br&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;binding&amp;nbsp;……&amp;nbsp;sendTimeout&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;“&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;00:10:00&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;“&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Note, the configuration of Binding on the service and client side must keep 
in consistent.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7105005" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/brucezhang/archive/tags/WCF/default.aspx">WCF</category></item></channel></rss>
