<?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>Paolo Pialorsi - Bridge The Gap! : SOA</title><link>http://weblogs.asp.net/paolopia/archive/tags/SOA/default.aspx</link><description>Tags: SOA</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Handling custom SOAP headers via WCF Behaviors</title><link>http://weblogs.asp.net/paolopia/archive/2008/02/25/handling-custom-soap-headers-via-wcf-behaviors.aspx</link><pubDate>Mon, 25 Feb 2008 10:13:14 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5858753</guid><dc:creator>paolopia</dc:creator><author>paolopia</author><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/paolopia/rsscomments.aspx?PostID=5858753</wfw:commentRss><comments>http://weblogs.asp.net/paolopia/archive/2008/02/25/handling-custom-soap-headers-via-wcf-behaviors.aspx#comments</comments><description>&lt;p&gt;A few days ago a customer of mine asked me how to define a WCF behavior to add a custom SOAP Header to sent/received messages.&lt;/p&gt; &lt;p&gt;The solution is not so far from what I've shown in the previous "&lt;a href="http://weblogs.asp.net/paolopia/archive/2007/08/23/writing-a-wcf-message-inspector.aspx"&gt;Writing a WCF Message Inspector&lt;/a&gt;" post. In fact one way of working is to define a custom message inspector that writes/reads the custom SOAP Header.&lt;/p&gt; &lt;p&gt;So first of all we need a SOAP Header. Here is the code to define a custom header to handle a random key (as a Guid) injected in every request sent from the consumer to the service:&lt;/p&gt; &lt;p&gt;&lt;font color="#008080"&gt;public class CustomHeader : MessageHeader&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String _key; &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String Key&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&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; return (this._key);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public CustomHeader(String key)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this._key = key;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override string Name&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return (CustomHeaderNames.CustomHeaderName); }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override string Namespace&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return (CustomHeaderNames.CustomHeaderNamespace); }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void OnWriteHeaderContents(System.Xml.XmlDictionaryWriter writer, MessageVersion messageVersion)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write the content of the header directly using the XmlDictionaryWriter&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writer.WriteElementString(CustomHeaderNames.KeyName, this.Key);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static CustomHeader ReadHeader(XmlDictionaryReader reader)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Read the header content (key) using the XmlDictionaryReader&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (reader.ReadToDescendant(CustomHeaderNames.KeyName, CustomHeaderNames.CustomHeaderNamespace))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&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; String key = reader.ReadElementString();&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; return (new CustomHeader(key));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&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; return null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;br&gt;&lt;font color="#008080"&gt;} &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;public static class CustomHeaderNames&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const String CustomHeaderName = "CustomHeader"; &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const String KeyName = "Key"; &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const String CustomHeaderNamespace = "&lt;/font&gt;&lt;a href="http://schemas.devleap.com/CustomHeader&amp;quot;;"&gt;&lt;font color="#008080"&gt;http://schemas.devleap.com/CustomHeader";&lt;/font&gt;&lt;/a&gt; &lt;p&gt;&lt;font color="#008080"&gt;}&lt;/font&gt; &lt;p&gt;As you can see it is a type inheriting from &lt;em&gt;MessageHeader &lt;/em&gt;class. Notice the OnWriteHeaderContents override, which is invoked by WCF infrastructure to serialize the SOAP Header, and the ReadHeader static method that we will use later.&lt;/p&gt; &lt;p&gt;Such a SOAP Header need to be added by the consumer and read by the service. To do this we need a MessageInspector like the following one:&lt;/p&gt; &lt;p&gt;&lt;font color="#008080"&gt;public class CustomMessageInspector : IDispatchMessageInspector, IClientMessageInspector&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Message Inspector of the Service&lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Look for my custom header in the request&lt;br&gt;&lt;/font&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Int32 headerPosition = request.Headers.FindHeader(CustomHeaderNames.CustomHeaderName, CustomHeaderNames.CustomHeaderNamespace); &lt;/font&gt;&lt;/strong&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#008080"&gt;// Get an XmlDictionaryReader to read the header content&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlDictionaryReader reader =&lt;/font&gt;&lt;strong&gt;&lt;font color="#008080"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;request.Headers.GetReaderAtHeader(headerPosition); &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp; // Read it through its static method ReadHeader&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomHeader header = CustomHeader.ReadHeader(reader); &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Add the content of the header to the IncomingMessageProperties dictionary&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt; OperationContext.Current.IncomingMessageProperties.Add("key", header.Key); &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void BeforeSendReply(ref Message reply, object correlationState)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Message Inspector of the Consumer &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void AfterReceiveReply(ref Message reply, object correlationState)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public object BeforeSendRequest(ref Message request, IClientChannel channel)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Prepare the request message copy to be modified&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request = buffer.CreateMessage(); &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Simulate to have a random Key generation process&lt;br&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;&lt;strong&gt;request.Headers.Add(new CustomHeader(Guid.NewGuid().ToString())); &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#008080"&gt;&amp;nbsp; return null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;br&gt;}&lt;/font&gt; &lt;p&gt;As you can see from the code sample above, we use the IClientMessageInspector implementation to handle the addition of the header in the consumer-side code, while we use the IDispatchMessageInspector on the service side, to extract the header. It is interesting the FindHeader method of the MessageHeaders collection, as well as the method GetReaderAtHeader, provided by the same collection of SOAP Headers. The result of this last method is an XmlDictionaryReader that we use to read our custom header content, through the ReadHeader static method we've already introduced. &lt;p&gt;The service will be able to read the Key provided throught the custom SOAP header simply querying the IncomingMessageProperties dictionary: &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;OperationContext.Current.IncomingMessageProperties["key"]&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;Of course this custom MessageInspector needs to be plugged into the WCF pipeline using a custom behavior like the following one: &lt;p&gt;&lt;font color="#008080"&gt;[AttributeUsage(AttributeTargets.Class)]&lt;br&gt;public class CustomBehavior : Attribute, IEndpointBehavior&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region IEndpointBehavior Members &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomMessageInspector inspector = new CustomMessageInspector();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clientRuntime.MessageInspectors.Add(inspector);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ChannelDispatcher channelDispatcher = endpointDispatcher.ChannelDispatcher;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (channelDispatcher != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&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; foreach (EndpointDispatcher ed in channelDispatcher.Endpoints)&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; {&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; CustomMessageInspector inspector = new CustomMessageInspector();&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; ed.DispatchRuntime.MessageInspectors.Add(inspector);&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; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Validate(ServiceEndpoint endpoint)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;br&gt;}&lt;/font&gt; &lt;p&gt;We also need an ExtensionElement to configure the behavior:&lt;/p&gt; &lt;p&gt;&lt;font color="#008080"&gt;public class CustomBehaviorExtensionElement : BehaviorExtensionElement&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override object CreateBehavior()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new CustomBehavior();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override Type BehaviorType&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&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; return typeof(CustomBehavior);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/font&gt; &lt;p&gt;At last we can configure in the .config file of our service and consumer the behavior. Here is the service side configuration:&lt;/p&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;lt;system.serviceModel&amp;gt; &lt;/font&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&amp;nbsp; &amp;lt;extensions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behaviorExtensions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="customBehavior" type="DevLeap.WCF.Behaviors.Extensions.CustomBehaviorExtensionElement, DevLeap.WCF.Behaviors.Extensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behaviorExtensions&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/extensions&amp;gt;&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;lt;services&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;service name="DevLeap.WCF.Behaviors.Services.ServiceOne" behaviorConfiguration="serviceBehavior"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpoint&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; address="net.tcp://localhost:35001/ServiceOne/"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; binding="netTcpBinding"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contract="DevLeap.WCF.Behaviors.Contracts.IServiceOne"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt; &lt;/font&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;behaviorConfiguration="endpointBehavior"&lt;/font&gt; &lt;/strong&gt;/&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/service&amp;gt;&lt;br&gt;&amp;lt;/services&amp;gt; &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;lt;behaviors&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;endpointBehaviors&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behavior name="endpointBehavior"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#008080"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&amp;lt;customBehavior /&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behavior&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/endpointBehaviors&amp;gt; &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp; &amp;lt;/behaviors&amp;gt; &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;lt;/system.serviceModel&amp;gt;&lt;/font&gt;  &lt;p&gt;And here is the configuration of the consumer-side: &lt;p&gt;&lt;font color="#008080"&gt;&amp;lt;system.serviceModel&amp;gt; &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;extensions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behaviorExtensions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="customBehavior" type="DevLeap.WCF.Behaviors.Extensions.CustomBehaviorExtensionElement, DevLeap.WCF.Behaviors.Extensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behaviorExtensions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/extensions&amp;gt;&lt;/font&gt;&lt;/strong&gt; &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;client&amp;gt;&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;lt;endpoint name="serviceOneEndpoint" &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; address="net.tcp://localhost:35001/ServiceOne/"&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; binding="netTcpBinding"&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; contract="DevLeap.WCF.Behaviors.Contracts.IServiceOne"&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; &lt;strong&gt;&lt;font color="#ff0000"&gt;behaviorConfiguration="serviceOneBehavior" &lt;/font&gt;&lt;/strong&gt;/&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/client&amp;gt; &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behaviors&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;endpointBehaviors&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behavior name="serviceOneBehavior"&amp;gt;&lt;br&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;customBehavior /&amp;gt;&lt;br&gt;&lt;/strong&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behavior&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/endpointBehaviors&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behaviors&amp;gt; &lt;/font&gt; &lt;p&gt;&lt;font color="#008080"&gt;&amp;lt;/system.serviceModel&amp;gt;&lt;/font&gt; &lt;p&gt;That's all! Enjoy your custom SOAP header defining infrastructural protocols, but don't forget to check the wide range of WS-* specifications before inventing your own :-) ...&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5858753" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/paolopia/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/paolopia/archive/tags/WCF+_2800_Indigo_2900_/default.aspx">WCF (Indigo)</category><category domain="http://weblogs.asp.net/paolopia/archive/tags/SOA/default.aspx">SOA</category></item><item><title>WCF Security Full Demo</title><link>http://weblogs.asp.net/paolopia/archive/2007/12/16/wcf-security-full-demo.aspx</link><pubDate>Sun, 16 Dec 2007 15:57:55 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5461791</guid><dc:creator>paolopia</dc:creator><author>paolopia</author><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/paolopia/rsscomments.aspx?PostID=5461791</wfw:commentRss><comments>http://weblogs.asp.net/paolopia/archive/2007/12/16/wcf-security-full-demo.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://devlab.devleap.it/PaoloPi/WebCast/DevLeap.WCF.SecurityFullDemo-15122007.zip"&gt;Here&lt;/a&gt; you can find the last version of a sample application showing many of the security features and configuration of WCF in the fields of security.&lt;br&gt;I've just updated it in order to release it during my last WebCast about &lt;a href="http://www.microsoft.com/italy/msdn/risorsemsdn/security/path/default.mspx"&gt;WCF Security for MSDN Italy&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;In this sample you can see (adding/removing endpoints and configuration elements from the config file):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Windows Authentication and Windows Authorization via transport level security on basicHttpBinding&lt;/li&gt; &lt;li&gt;Windows Authentication and Windows Authorization via message level security on wsHttpBinding&lt;/li&gt; &lt;li&gt;UsernamePasswordToken Authentication with ASP.NET Membership and ASP.NET Role Authorization via message level security on wsHttpBinding&lt;/li&gt; &lt;li&gt;UsernamePasswordToken Authentication with custom validator via message level security on wsHttpBinding&lt;/li&gt; &lt;li&gt;Authorization using a custom Authorization Policy&lt;/li&gt; &lt;li&gt;Impersonation using Windows credentials &lt;/li&gt; &lt;li&gt;Custom impersonation of custom Principal and Identity&lt;/li&gt; &lt;li&gt;Handling of multiple identities (one Primary plus others)&lt;/li&gt; &lt;li&gt;A quick and basic sample of interoperability with ASMX consumers using a custom UsernamePasswordToken over SSL, in the respect of WS-Security and &lt;a href="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdf"&gt;WSS UsernameToken Profile 1.0 by Oasis&lt;/a&gt;, without using WSE&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Enjoy and feel free to give me your &lt;a href="mailto:paolo@devleap.com"&gt;feedbacks&lt;/a&gt; or further suggestions.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5461791" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/paolopia/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/paolopia/archive/tags/Web+Services/default.aspx">Web Services</category><category domain="http://weblogs.asp.net/paolopia/archive/tags/WSE/default.aspx">WSE</category><category domain="http://weblogs.asp.net/paolopia/archive/tags/WCF+_2800_Indigo_2900_/default.aspx">WCF (Indigo)</category><category domain="http://weblogs.asp.net/paolopia/archive/tags/SOA/default.aspx">SOA</category></item><item><title>WCF Custom Authentication and Impersonation: demo source code</title><link>http://weblogs.asp.net/paolopia/archive/2006/02/05/437442.aspx</link><pubDate>Sun, 05 Feb 2006 22:36:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:437442</guid><dc:creator>paolopia</dc:creator><author>paolopia</author><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/paolopia/rsscomments.aspx?PostID=437442</wfw:commentRss><comments>http://weblogs.asp.net/paolopia/archive/2006/02/05/437442.aspx#comments</comments><description>&lt;p&gt;Related to &lt;A href="http://weblogs.asp.net/paolopia/archive/2005/12/08/432658.aspx"&gt;my last sample&lt;/a&gt; of custom authentication and impersonation within a WCF service, here is the &lt;a href="http://devlab.devleap.it/PaoloPi/WCF-Custom-Authentication/WCF-Custom-Authentication.zip"&gt;sample code&lt;/a&gt;.&lt;br /&gt;It works and compiles under GoLive WCF license. I hope you'll find it useful and interesting.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.devleap.com/paolo/articles/WCF_Custom_Authentication.aspx"&gt;Italian version&lt;/a&gt; - &lt;a href="http://blogs.devleap.com/paolo/articles/WCF_Custom_Authentication.aspx"&gt;Versione italiana&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;UPDATE:&lt;/font&gt; WinFx February CTP edition of this sample: coming soon ... sorry for the delay.&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=437442" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/paolopia/archive/tags/WCF+_2800_Indigo_2900_/default.aspx">WCF (Indigo)</category><category domain="http://weblogs.asp.net/paolopia/archive/tags/SOA/default.aspx">SOA</category></item><item><title>Distributed Transactions with Indigo and WS-AT</title><link>http://weblogs.asp.net/paolopia/archive/2005/06/23/414412.aspx</link><pubDate>Thu, 23 Jun 2005 00:13:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:414412</guid><dc:creator>paolopia</dc:creator><author>paolopia</author><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/paolopia/rsscomments.aspx?PostID=414412</wfw:commentRss><comments>http://weblogs.asp.net/paolopia/archive/2005/06/23/414412.aspx#comments</comments><description>&lt;p&gt;This evening I played with Indigo and WS-AT, to see if it works, in order to use it in a project of a customer of mine.&lt;/p&gt; &lt;p&gt;First of all the good news: it works :-) as it did in PDC03 bits! Great job guys!&lt;br /&gt;Second news: it's not so easy to manage all the stuff, but at least it works fine.&lt;/p&gt; &lt;p&gt;I developed two different services, working on a couple of SQL Server 2005 database.&lt;br /&gt;One service is exposed using a net.tcp (netProfileTcpBinding) binding. The other is exposed using http (wsProfileBinding), self-hosted.&lt;/p&gt; &lt;p&gt;Both are used by a third party client, that covers the transactional work with a TransactionScope.&lt;/p&gt; &lt;p&gt;Here is a sample of one of the two transactional services:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;namespace ServiceOne&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;[ServiceContract(&lt;br /&gt;&amp;nbsp;&amp;nbsp;FormatMode=ContractFormatMode.XmlFormatter,&lt;br /&gt;&amp;nbsp;&amp;nbsp;Namespace="&lt;/font&gt;&lt;a href="http://schemas.devleap.com/Services/OrderService1"&gt;&lt;font face="Courier New" size="2"&gt;http://schemas.devleap.com/Services/OrderService1&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt;",&lt;br /&gt;&amp;nbsp;&amp;nbsp;Style=ServiceOperationStyle.DocumentBare,&lt;br /&gt;&amp;nbsp;&amp;nbsp;Use=ServiceOperationBindingUse.Literal)]&lt;br /&gt;&lt;strong&gt;&amp;nbsp;[BindingRequirements(&lt;br /&gt;&amp;nbsp;&amp;nbsp;TransactionFlowRequirements = RequirementsMode.Require)]&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;public interface ITxServiceOne&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;[OperationContract(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Action="urn:saveOrder1")]&lt;br /&gt;&amp;nbsp;&amp;nbsp;Int32 SaveOrder(OrdersLibrary.Order order);&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;strong&gt;&amp;nbsp;[ServiceBehavior(&lt;br /&gt;&amp;nbsp;&amp;nbsp;AllowConcurrentTransactions=true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;TransactionIsolationLevel=IsolationLevel.ReadCommitted)]&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;public class TxServiceOne: ITxServiceOne&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;[OperationBehaviorAttribute(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;AutoEnlistTransaction = true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;AutoCompleteTransaction = true)]&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;public int SaveOrder(OrdersLibrary.Order order)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;OrdersLibrary.OrderBiz ob = new OrdersLibrary.OrderBiz();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (ob.SaveOrder(order));&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Take care of &lt;strong&gt;BindingRequirements&lt;/strong&gt; and &lt;strong&gt;OperationBehavior&lt;/strong&gt; attributes, respectively on the service contract and on the operation implementation.&lt;/p&gt; &lt;p&gt;Here is the service side configuration file:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;br /&gt;&amp;lt;configuration xmlns="&lt;/font&gt;&lt;a href="http://schemas.microsoft.com/.NetConfiguration/v2.0"&gt;&lt;font face="Courier New" size="2"&gt;http://schemas.microsoft.com/.NetConfiguration/v2.0&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt;"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;appSettings&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;add key="SqlConnectionString" value="..."/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/appSettings&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;system.serviceModel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;services&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;service &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serviceType="ServiceOne.TxServiceOne, ServiceOne"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;behaviorConfiguration="txServiceBehavior"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;endpoint&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contractType="ServiceOne.ITxServiceOne, ServiceOne"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;address="&lt;/font&gt;&lt;a href="http://localhost:35000/TxServiceOne.svc"&gt;&lt;font face="Courier New" size="2"&gt;http://localhost:35000/TxServiceOne.svc&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" size="2"&gt;"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bindingConfiguration="txBinding" &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bindingSectionName="wsProfileBinding" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/service&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/services&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;bindings&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;wsProfileBinding&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;binding configurationName="txBinding" &lt;strong&gt;flowTransactions="Required"&lt;/strong&gt; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/wsProfileBinding&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/bindings&amp;gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;lt;behaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;behavior &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;configurationName="txServiceBehavior"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;returnUnknownExceptionsAsFaults="true" &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/behavior&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/behaviors&amp;gt;&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;lt;/system.serviceModel&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;Pay attention to the &lt;strong&gt;behaviors&lt;/strong&gt; section, where I declare to manage any exception as a Fault. &lt;br /&gt;Take a look also at the custom binding configuration, defined in order to &lt;strong&gt;require transactions&lt;/strong&gt;.&lt;br /&gt;The other service is very similar to the first one.&lt;/p&gt; &lt;p&gt;Lastly here is the main part of client code:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;schemas.devleap.com.EntitiesOrder.Order order = new schemas.devleap.com.EntitiesOrder.Order();&lt;br /&gt;order.id = 10;&lt;br /&gt;order.description = "Order 10";&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;TransactionOptions options = new TransactionOptions();&lt;br /&gt;options.IsolationLevel = IsolationLevel.ReadCommitted;&lt;br /&gt;options.Timeout = TimeSpan.FromSeconds(30);&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))&lt;br /&gt;&lt;/strong&gt;{&lt;br /&gt;&amp;nbsp;TxServiceOneProxy svcOne = null;&lt;br /&gt;&amp;nbsp;TxServiceTwoProxy svcTwo = null;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;// External transactional activity&lt;br /&gt;&amp;nbsp;&amp;nbsp;svcOne = new TxServiceOneProxy();&lt;br /&gt;&amp;nbsp;&amp;nbsp;Console.WriteLine("Service One: {0}", svcOne.SaveOrder(order));&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Internal transactional activity&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;svcTwo = new TxServiceTwoProxy();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine("Service Two: {0}", svcTwo.SaveOrder(order));&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Transaction commit, in case of success&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;scope.Complete();&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Internal channel closing&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;&amp;nbsp;svcTwo.Close();&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;finally&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;// External channel closing&lt;br /&gt;&amp;nbsp;&lt;strong&gt;&amp;nbsp;svcOne.Close();&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;}&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://devlab.devleap.it/PaoloPi/Indigo/Indigo-Transactions-Demo.zip"&gt;Here&lt;/a&gt; you can find all the code of the demo solution I developed to test WS-AT support in Indigo.&lt;/p&gt; &lt;p&gt;In order to make it work, don't forget to download this fix (published on 21/06/2005):&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=32187993-4736-4a06-97c7-1282b67e3137&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=32187993-4736-4a06-97c7-1282b67e3137&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I hope you'll enjoy your Indigo transactional experience :-) !&lt;br /&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=414412" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/paolopia/archive/tags/WCF+_2800_Indigo_2900_/default.aspx">WCF (Indigo)</category><category domain="http://weblogs.asp.net/paolopia/archive/tags/SOA/default.aspx">SOA</category></item><item><title>One day conference about SOA and Smart Clients development</title><link>http://weblogs.asp.net/paolopia/archive/2004/11/27/270969.aspx</link><pubDate>Sat, 27 Nov 2004 14:30:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:270969</guid><dc:creator>paolopia</dc:creator><author>paolopia</author><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/paolopia/rsscomments.aspx?PostID=270969</wfw:commentRss><comments>http://weblogs.asp.net/paolopia/archive/2004/11/27/270969.aspx#comments</comments><description>I'm working on a Conference Day about SOA and Smart Clients development with Microsoft .NET Framework. It will be on Friday 14 of January 2005, here in Italy, in my town (Brescia). If you're Italian and you like to come .... &lt;a href="http://devlab.devleap.it/PaoloPi/DevConOneDay-SOA/DevConOneDay-SOA.ics"&gt;catch the date&lt;/a&gt; and stay tuned on my blog.&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=270969" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/paolopia/archive/tags/Web+Services/default.aspx">Web Services</category><category domain="http://weblogs.asp.net/paolopia/archive/tags/WSE/default.aspx">WSE</category><category domain="http://weblogs.asp.net/paolopia/archive/tags/SOA/default.aspx">SOA</category></item><item><title>FABRIQ: Architecture for High Performance, Decentralized, Agent-Oriented, Connected Applications (ARC405)</title><link>http://weblogs.asp.net/paolopia/archive/2004/06/30/169734.aspx</link><pubDate>Wed, 30 Jun 2004 13:34:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:169734</guid><dc:creator>paolopia</dc:creator><author>paolopia</author><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/paolopia/rsscomments.aspx?PostID=169734</wfw:commentRss><comments>http://weblogs.asp.net/paolopia/archive/2004/06/30/169734.aspx#comments</comments><description>&lt;P&gt;Good session about &lt;A href="http://workspaces.gotdotnet.com/fabriq/"&gt;FABRIQ&lt;/A&gt;, a new framework defined as&amp;nbsp;an "Agent Oriented Architectural Pattern".&lt;BR&gt;The idea is to provide a framework to architect and develop applications&amp;nbsp; that need: &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Scalability 
&lt;LI&gt;Processing of incomplete informations 
&lt;LI&gt;Latency of messages 
&lt;LI&gt;Long running operations and/or transactions&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Some requirements for architectures that can be handled by FABRIQ are:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Elastic processing 
&lt;LI&gt;Quick scalability 
&lt;LI&gt;Break complex tasks into smaller one 
&lt;LI&gt;Maximize throughput&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;The solution is based on&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Primitive handlers (routing, mapping, transform, log, encrypt, etc.) 
&lt;LI&gt;Processing units: composition of primitive handlers in a pipeline 
&lt;LI&gt;Networks: composition of processing units, based on routing rules, that move messages through pipelines of processing units (something like and EndpointReference linked list)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Key point: all messages are delivered with a one-way messaging paradigm. Messages move through agents.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Caveat:&amp;nbsp; &lt;SPAN&gt;"An agent is a self-contained, problem-solving system capable of autonomous, reactive, pro-active, internally motivated, social behaviour". Those agents don't relate to Business Agents mentioned by Don Box yesterday.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;From an implementation point of view we have:&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN&gt;&lt;EM&gt;Message&lt;/EM&gt;: the class representing a message. Can handle messages of any size, also very big one (like stream of hundreds of MB). Handles the body as an XmlReader. Provides access to Headers as a &lt;EM&gt;MessageHeaderCollection &lt;/EM&gt;of &lt;EM&gt;MessageHeader&lt;/EM&gt;.&lt;/SPAN&gt; 
&lt;LI&gt;&lt;SPAN&gt;&lt;EM&gt;IMessageHandler&lt;/EM&gt;: base interface for message handlers. Provides a method: &lt;EM&gt;bool Process(Message);&lt;/EM&gt;&lt;/SPAN&gt; 
&lt;LI&gt;&lt;SPAN&gt;We can build chains of Handlers using &lt;EM&gt;IChainableMessageHandler &lt;/EM&gt;implementations.&lt;/SPAN&gt; 
&lt;LI&gt;&lt;SPAN&gt;&lt;EM&gt;IFabriqMessageHandler &lt;/EM&gt;is the base interface for transaction message handling. Transaction are based on two phase commit paradigm with &lt;EM&gt;Prepare() &lt;/EM&gt;method and the consequent &lt;EM&gt;Commit() &lt;/EM&gt;or &lt;EM&gt;Abort() &lt;/EM&gt;one based on &lt;EM&gt;vote&lt;/EM&gt; of the handlers.&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;Key point: FABRIQ is hosted in Enterprise Services, not in IIS/ASP.NET. We can receive messages through ASP.NET using a IHttpHandler implementation (FabriqHttpHandler) that simply enqueues the messages into a MSMQ queue for standard processing by the FABRIQ engine.&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;A great feature of FABRIQ is the configuration management in case of many nodes in load balancing. In fact Clemens showed us that FABRIQ uses itself to dispatch configuration files and also .NET assemblies, eventually required, to all FABRIQ nodes automatically. Great idea guys!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;Key point: from a security point of view FABRIQ is based on WSE2 engine, using OASIS WS-Security and WS-Policy. Internally messages are converted from SoapEnvelopes to FABRIQ messages and back.&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Questions for Clemens:&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN&gt;What about asynchronous message handlers? I can't find them. Probably because from a pipeline point of view we can not parallelize the jobs, should we use parallel nodes with routing rules?&lt;/SPAN&gt; 
&lt;LI&gt;&lt;SPAN&gt;Can we cover different nodes under the same two-phase commit transaction?&lt;/SPAN&gt; 
&lt;LI&gt;&lt;SPAN&gt;What about request/response paradigm? What should I do in order to be able to provide answers to clients? Should I use a request/response Web Service as a front-end and a FABRIQ back-end? Should I use a MSMQ to inform my clients of the outcomes? What else?&lt;/SPAN&gt; 
&lt;LI&gt;&lt;SPAN&gt;In case of failure we have the capability to handle transactions. How should we inform our clients of the problem?&lt;/SPAN&gt; 
&lt;LI&gt;&lt;SPAN&gt;Why did you re-defined ThreadPool? In order to have many thread pool in the same AppDomain and with customizable size? Or am I missing the point?&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=169734" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/paolopia/archive/tags/SOA/default.aspx">SOA</category></item><item><title>BizTalk 2004 for the Visual Basic and C# Developer (EBZ214)</title><link>http://weblogs.asp.net/paolopia/archive/2004/06/30/169604.aspx</link><pubDate>Wed, 30 Jun 2004 09:28:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:169604</guid><dc:creator>paolopia</dc:creator><author>paolopia</author><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/paolopia/rsscomments.aspx?PostID=169604</wfw:commentRss><comments>http://weblogs.asp.net/paolopia/archive/2004/06/30/169604.aspx#comments</comments><description>Great session! Scott Woodgate is a guarantee! It&amp;nbsp;was a 200 level session, so not so deep in BizTalk architecture and programmability, but really a good session!&lt;BR&gt;Aside from the "standard" contents of a session like this,&amp;nbsp; Scott showed us a wizard, fully integrated with VS.NET, to create BizTalk Adapters that he's working on. He told us that it will be available in a few days, probably next week, on &lt;A href="http://blogs.msdn.com/scottwoo/"&gt;his blog&lt;/A&gt;. Good job Scott! Thanks!&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=169604" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/paolopia/archive/tags/SOA/default.aspx">SOA</category></item><item><title>Service-Orientation and the Windows/.NET Developer (CTS200)</title><link>http://weblogs.asp.net/paolopia/archive/2004/06/29/168955.aspx</link><pubDate>Tue, 29 Jun 2004 17:30:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:168955</guid><dc:creator>paolopia</dc:creator><author>paolopia</author><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/paolopia/rsscomments.aspx?PostID=168955</wfw:commentRss><comments>http://weblogs.asp.net/paolopia/archive/2004/06/29/168955.aspx#comments</comments><description>&lt;P lang=IT style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;A non-standard :-) session, based on Q&amp;amp;A instead of slides ... It was a good idea Don, expecially in a session late in a long day.&lt;/P&gt;
&lt;P lang=IT style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;The key concepts of this session, as I understood since my bad English understanding :-), were:&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 1in; DIRECTION: ltr; unicode-bidi: embed" type=circle&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;SOA: Set of ideas for structuring software&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;Protocols: not just ideas but concrete to move the bits on the wire&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;Web Services: a set of protocols&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;Protocols natively supported by Indigo (out of the box ... in the future...)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL style="MARGIN-TOP: 0in; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.5in; DIRECTION: ltr; unicode-bidi: embed" type=disc&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 3"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;SOAP over HTTP (one-way and request/response)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 3"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;SOAP over TCP&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL style="MARGIN-TOP: 0in; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.5in; DIRECTION: ltr; unicode-bidi: embed" type=square&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 4"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;Not faster than HTTP&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 4"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;Duplex messaging&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 3"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;SOAP over IPC (locally for security reasons)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL style="MARGIN-TOP: 0in; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.5in; DIRECTION: ltr; unicode-bidi: embed" type=square&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 4"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;Faster than HTTP and TCP&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 4"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;Duplex messaging&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 3"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;SMTP: there's no time... if we won't Indigo before 2009 :-)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 3"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;MSMQ: why not ... may be...&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;A kind of TCPChannel + BinaryFormatter will not be supported because in .NET Remoting, using tcp+binary, there're some issues:&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL style="MARGIN-TOP: 0in; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.5in; DIRECTION: ltr; unicode-bidi: embed" type=disc&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 3"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;Version brittleness: you pay the pains of versioning&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 3"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;Performance issues: it's good but not great, because of lack of testing and evolution during the time&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 3"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;Security-ness: there's no security built-in&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;In order to work with a "contract-first" approach in .NET 2.0 we can:&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL style="MARGIN-TOP: 0in; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.5in; DIRECTION: ltr; unicode-bidi: embed" type=disc&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 3"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;Use WSDL.EXE /SERVER as before&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 3"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;WhiteHorse designer&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 3"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;WSDL (XML) editor provided by VS2005 with intellisense (great!)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 3"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;Third party tools :-)&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;OO is like microelettronics. Every microchip needs its socket, with the right number of pins. When we use Objects we're using something with which we're always 100% comfortable and build to do exactly what we're asking it to do. Object are difficult to version. There's no way to have real transparent versioning.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;SO is for agile development and deployment, for field replacement and great versioning. Share schemas and contracts in order to achieve these goals. SO doesn't require to share DLLs on both the sides. So deployment and versioning are easier than with OO.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;SO in Longhorn:&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL style="MARGIN-TOP: 0in; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 0.5in; DIRECTION: ltr; unicode-bidi: embed" type=disc&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 3"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;for instance WMI will be redone in SO&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;&lt;STRONG&gt;Business Agents: the next buzword (in TechEd 2006... stay tuned :-) !)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P lang=IT style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: Verdana; mso-outline-level: 2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 1in; DIRECTION: ltr; unicode-bidi: embed" type=circle&gt;
&lt;LI lang=IT style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"&gt;&lt;SPAN style="FONT-FAMILY: Verdana"&gt;Many other questions will be answered on &lt;A href="http://www.gotdotnet.com/team/dbox/"&gt;Don's blog&lt;/A&gt;.&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=168955" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/paolopia/archive/tags/WCF+_2800_Indigo_2900_/default.aspx">WCF (Indigo)</category><category domain="http://weblogs.asp.net/paolopia/archive/tags/SOA/default.aspx">SOA</category></item><item><title>soap.msmq Transport for WSE2</title><link>http://weblogs.asp.net/paolopia/archive/2004/06/25/165869.aspx</link><pubDate>Fri, 25 Jun 2004 15:35:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:165869</guid><dc:creator>paolopia</dc:creator><author>paolopia</author><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/paolopia/rsscomments.aspx?PostID=165869</wfw:commentRss><comments>http://weblogs.asp.net/paolopia/archive/2004/06/25/165869.aspx#comments</comments><description>&lt;P&gt;Thanks to Roman Kiss we are able to move SOAP messages over MSMQ with WSE2 !!!&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.codeproject.com/useritems/SoapMSMQ.asp"&gt;http://www.codeproject.com/useritems/SoapMSMQ.asp&lt;/A&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=165869" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/paolopia/archive/tags/Web+Services/default.aspx">Web Services</category><category domain="http://weblogs.asp.net/paolopia/archive/tags/WSE/default.aspx">WSE</category><category domain="http://weblogs.asp.net/paolopia/archive/tags/SOA/default.aspx">SOA</category></item><item><title>Offline Application Block: persistent MSMQQueueStorageProvider</title><link>http://weblogs.asp.net/paolopia/archive/2004/06/20/160182.aspx</link><pubDate>Sat, 19 Jun 2004 22:47:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:160182</guid><dc:creator>paolopia</dc:creator><author>paolopia</author><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/paolopia/rsscomments.aspx?PostID=160182</wfw:commentRss><comments>http://weblogs.asp.net/paolopia/archive/2004/06/20/160182.aspx#comments</comments><description>&lt;P&gt;Microsoft &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/offline.asp"&gt;Smart Client Offline Application Block&lt;/A&gt; makes possible to build applications that are network aware and that are able to work online or offline. When offline you can enqueue messages for central services using many different kind of QueueStorageProvider. One of the pre-built QueueStorageProvider is MSMQQueueStorageProvider that, as you can argue from its name, is a queue provider based on MSMQ. It works with a private queue not transactional by default. Sometimes it happens that you would like to make your messages persistent in order to keep trace of them in case of your Smart Client host shutdown, reboot, crash, etc.&lt;/P&gt;
&lt;P&gt;In order to have a MSMQ Queue that keeps track of messages even if you switch off your client you need to mark your messages as Recoverable. To do that you can do either of:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Set to true the property Recoverable of a System.Messaging.Message instance before enqueueing it&lt;/LI&gt;
&lt;LI&gt;Mark the queue as transactional&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;By default MSMQQueueStorageProvider, doesn't use a transactional queue and doesn't mark a message as Recoverable.&lt;BR&gt;Here is a code snippet to replace in MSMQQueueStorageProvider in order to have Recoverable messages:&lt;/P&gt;&lt;PRE style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;BR&gt;/// &lt;SUMMARY&gt;
/// Responsible for storing array of bytes into MSMQ
/// &lt;/SUMMARY&gt;
/// &lt;PARAM name="objectToStream"&gt;Object as a byte array to store into MSMQ&lt;/PARAM&gt;
override protected void DoEnqueue(byte[] objectToStream)
{
&lt;STRONG&gt; Message msg = new Message(objectToStream);   
 msg.Formatter = queue.Formatter;
 msg.Recoverable = true;
 queue.Send(msg);
&lt;/STRONG&gt;}&lt;BR&gt;
&lt;/PRE&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=160182" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/paolopia/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/paolopia/archive/tags/SOA/default.aspx">SOA</category></item></channel></rss>