<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/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>Mattias Lindberg : .NET Framework</title><link>http://blogs.msdn.com/mattlind/archive/tags/.NET+Framework/default.aspx</link><description>Tags: .NET Framework</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Validating XML Digital Signatures with References Using Unrecognized URI Prefixes</title><link>http://blogs.msdn.com/mattlind/archive/2006/10/10/Validating-XML-Digital-Signatures-with-References-Using-Unrecognized-URI-Prefixes.aspx</link><pubDate>Tue, 10 Oct 2006 15:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:811419</guid><dc:creator>mattlind</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mattlind/comments/811419.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattlind/commentrss.aspx?PostID=811419</wfw:commentRss><description>&lt;P&gt;During the last few month I have been working on and off on a solution which implements security features for a larger project, part of this work has been to create a wrapper around the XML Digital Signature functionality of .NET Framework 2.0. I thought that I would share a solution to a problem related to validating messages that has reference URIs&amp;nbsp;on the form "cid:&amp;lt;somename&amp;gt;", some of you&amp;nbsp;may recognize this as a reference to a Content-ID (cid) in a MIME message. &lt;/P&gt;
&lt;P&gt;I had a signed message that looked something like the sample at the end of this post. Make note of the &amp;lt;Reference&amp;gt; elements and examine the URI attributes.&lt;/P&gt;
&lt;P&gt;This XML message was the body of a multipart MIME message and each URI references a message part in the MIME message through the&amp;nbsp;MIME&amp;nbsp;Content-ID. If you load this message in a SignedXml instance and call&amp;nbsp; CheckSignature you will receive the error: "The URI prefix is not recognized". This error is not unreasonable as SignedXml tries to use the URI to resolve the reference but cannot do that, but I still needed to validate the reference.&lt;/P&gt;
&lt;P&gt;I tried various ways to work around this problem. The one that I thought had&amp;nbsp;most merit tried to add Reference instances (associated to the SignedXml instance) which were loaded with the proper data and URI, but neither that nor any other attempt involving pre-populating data in the SignedXml&amp;nbsp;were successful. However, while working with this problem I was examining the call stack of the "The URI prefix is not recognized" error when the solution became obvious to me. Below is a recreation of the call stack:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;System.NotSupportedException: The URI prefix is not recognized.&lt;BR&gt;at System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase)&lt;BR&gt;at System.Net.WebRequest.Create(Uri requestUri)&lt;BR&gt;at System.Security.Cryptography.Xml.Reference.CalculateHashValue(XmlDocument document, CanonicalXmlNodeList refList)&lt;BR&gt;at System.Security.Cryptography.Xml.SignedXml.CheckDigestedReferences()&lt;BR&gt;at System.Security.Cryptography.Xml.SignedXml.CheckSignature()&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;I realized that it was WebRequest.Create that threw the error, but as this is an extensible part of .NET all I have to do is to registering "cid" as a valid URI with .NET! If you enable "cid" by calling &lt;A href="http://msdn2.microsoft.com/en-us/library/system.net.webrequest.registerprefix.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/system.net.webrequest.registerprefix.aspx"&gt;WebRequest.RegisterPrefix&lt;/A&gt;&amp;nbsp;then WebRequest.Create will be able to lookup the reference based on the URI. Below is a description of the steps involved in the solution:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;To register "cid" as an URI in .NET you do this: &lt;FONT face="Courier New"&gt;bool registrationResult = WebRequest.RegisterPrefix("cid:", new CidRequestCreator());&lt;/FONT&gt; 
&lt;LI&gt;Use the classes and techniques described in &lt;A href="http://support.microsoft.com/kb/812409/EN-US/" mce_href="http://support.microsoft.com/kb/812409/EN-US/"&gt;http://support.microsoft.com/kb/812409/EN-US/&lt;/A&gt;&amp;nbsp;to create the CidRequestCreator, CidWebRequest and CidWebResponse. The KB article describes how to do implement support for the "FTP" URI prefix, so I modified it to work with "cid" the way I wanted it to (read the data stream&amp;nbsp;from a file based on the URI). 
&lt;LI&gt;Before calling SignedXml.CheckSignature you need to save the attachments to the folder from which the CidWebRequest classes read messages.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Below is a high-level example of the logical steps that needs to be performed in my solution:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;RegisterCidUriPrefix();&lt;BR&gt;foreach(string&amp;nbsp;uri in _attachments.Keys)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; SaveAttachmentToDisk(uri, _attachments[uri]);&lt;BR&gt;}&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;BR&gt;SignedXml signedXml = new SignedXml(xmlDocument); &lt;BR&gt;XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature");&lt;BR&gt;signedXml.LoadXml((XmlElement)nodeList[0]); &lt;BR&gt;&lt;BR&gt;res = signedXml.CheckSignature();&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Please note that RegisterPrefix is only required to be called once per process (or it might be per application domain), this means that if you call it multiple times it will only return true the first time and additional calls will return false. I do not know how expensive the call the RegisterPrefix is, but it might be a good optimization to keep track of if you already have called RegisterPrefix and avoid calling it multiple times.&lt;/P&gt;
&lt;P&gt;While customizing the FTP-sample I was able to remove most of the properties of request and response classes, but I also needed to add a Close method to the CidWebResponse class as the stream to the file needs to be closed. The file stream was opened in the constructor of the CidWebRequest class.&lt;/P&gt;
&lt;P&gt;Sample of a signed XML message:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&amp;lt;SOAP:Envelope xmlns:SOAP="&lt;/FONT&gt;&lt;A href="http://schemas.xmlsoap.org/soap/envelope/%22" mce_href='http://schemas.xmlsoap.org/soap/envelope/"'&gt;&lt;FONT face="Courier New" size=2&gt;http://schemas.xmlsoap.org/soap/envelope/"&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt;&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;SOAP:Header&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DroppedStuffNotRelevantToThisDiscussion&amp;nbsp;/&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;Signature xmlns:ns0="&lt;/FONT&gt;&lt;A href="http://schemas.xmlsoap.org/soap/envelope/%22" mce_href='http://schemas.xmlsoap.org/soap/envelope/"'&gt;&lt;FONT face="Courier New" size=2&gt;http://schemas.xmlsoap.org/soap/envelope/"&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt; xmlns="&lt;/FONT&gt;&lt;A href='http://www.w3.org/2000/09/xmldsig#"' mce_href='http://www.w3.org/2000/09/xmldsig#"'&gt;&lt;FONT face="Courier New" size=2&gt;http://www.w3.org/2000/09/xmldsig#"&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt;&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;SignedInfo&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;CanonicalizationMethod Algorithm="&lt;/FONT&gt;&lt;A href="http://www.w3.org/TR/2001/REC-xml-c14n-20010315%22" mce_href='http://www.w3.org/TR/2001/REC-xml-c14n-20010315"'&gt;&lt;FONT face="Courier New" size=2&gt;http://www.w3.org/TR/2001/REC-xml-c14n-20010315"&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt; /&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;SignatureMethod Algorithm="&lt;/FONT&gt;&lt;A href='http://www.w3.org/2000/09/xmldsig#rsa-sha1"' mce_href='http://www.w3.org/2000/09/xmldsig#rsa-sha1"'&gt;&lt;FONT face="Courier New" size=2&gt;http://www.w3.org/2000/09/xmldsig#rsa-sha1"&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt; /&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;Reference URI=""&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;Transforms&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;Transform Algorithm="&lt;/FONT&gt;&lt;A href='http://www.w3.org/2000/09/xmldsig#enveloped-signature"' mce_href='http://www.w3.org/2000/09/xmldsig#enveloped-signature"'&gt;&lt;FONT face="Courier New" size=2&gt;http://www.w3.org/2000/09/xmldsig#enveloped-signature"&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt; /&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;Transform Algorithm="&lt;/FONT&gt;&lt;A href="http://www.w3.org/TR/1999/REC-xpath-19991116%22" mce_href='http://www.w3.org/TR/1999/REC-xpath-19991116"'&gt;&lt;FONT face="Courier New" size=2&gt;http://www.w3.org/TR/1999/REC-xpath-19991116"&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt;&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;XPath xmlns:SOAP="&lt;/FONT&gt;&lt;A href="http://schemas.xmlsoap.org/soap/envelope/%22" mce_href='http://schemas.xmlsoap.org/soap/envelope/"'&gt;&lt;FONT face="Courier New" size=2&gt;http://schemas.xmlsoap.org/soap/envelope/"&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt;&amp;gt;not(ancestor-or-self::node()[@SOAP:actor="urn:oasis:names:tc:ebxml-msg:actor:nextMSH"] | ancestor-or-self::node()[@SOAP:actor="&lt;/FONT&gt;&lt;A href="http://schemas.xmlsoap.org/soap/actor/next%22])" mce_href='http://schemas.xmlsoap.org/soap/actor/next"])'&gt;&lt;FONT face="Courier New" size=2&gt;http://schemas.xmlsoap.org/soap/actor/next"])&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt;&amp;lt;/XPath&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;/Transform&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;/Transforms&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;DigestMethod Algorithm="&lt;/FONT&gt;&lt;A href='http://www.w3.org/2000/09/xmldsig#sha1"' mce_href='http://www.w3.org/2000/09/xmldsig#sha1"'&gt;&lt;FONT face="Courier New" size=2&gt;http://www.w3.org/2000/09/xmldsig#sha1"&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt; /&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;DigestValue&amp;gt;qBkMHkzxhFGG9HJ1j01u+rrVfGM=&amp;lt;/DigestValue&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;/Reference&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;Reference URI="cid:msg400123456"&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;DigestMethod Algorithm="&lt;/FONT&gt;&lt;A href='http://www.w3.org/2000/09/xmldsig#sha1"' mce_href='http://www.w3.org/2000/09/xmldsig#sha1"'&gt;&lt;FONT face="Courier New" size=2&gt;http://www.w3.org/2000/09/xmldsig#sha1"&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt; /&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;DigestValue&amp;gt;WHi7LauQVMt1IfJ3fXqorKEnWFs=&amp;lt;/DigestValue&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;/Reference&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;Reference URI="cid:msg400123456"&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;DigestMethod Algorithm="&lt;/FONT&gt;&lt;A href='http://www.w3.org/2000/09/xmldsig#sha1"' mce_href='http://www.w3.org/2000/09/xmldsig#sha1"'&gt;&lt;FONT face="Courier New" size=2&gt;http://www.w3.org/2000/09/xmldsig#sha1"&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face="Courier New" size=2&gt; /&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;DigestValue&amp;gt;+3ZwEOqRmtGtrSfzhicq8lem0w4=&amp;lt;/DigestValue&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;/Reference&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;/SignedInfo&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;SignatureValue&amp;gt;Ay1DK.../OdTLc=&amp;lt;/SignatureValue&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;KeyInfo&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&amp;lt;X509Data&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&amp;lt;X509Certificate&amp;gt;MIID9...stEw&amp;lt;/X509Certificate&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&amp;lt;/X509Data&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;/KeyInfo&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;/Signature&amp;gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&amp;lt;/SOAP:Header&amp;gt;&lt;BR&gt;&amp;lt;SOAP:Body&amp;gt;&lt;BR&gt;&amp;lt;/SOAP:Body&amp;gt;&lt;BR&gt;&amp;lt;/SOAP:Envelope&amp;gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=811419" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattlind/archive/tags/.NET+Framework/default.aspx">.NET Framework</category><category domain="http://blogs.msdn.com/mattlind/archive/tags/Security/default.aspx">Security</category></item><item><title>Notes on .NET 3.0 (WinFX) Tour Video</title><link>http://blogs.msdn.com/mattlind/archive/2006/08/11/694139.aspx</link><pubDate>Fri, 11 Aug 2006 10:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:694139</guid><dc:creator>mattlind</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mattlind/comments/694139.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattlind/commentrss.aspx?PostID=694139</wfw:commentRss><description>&lt;P&gt;MSDN Showtime has a show related to .NET 3.0,&amp;nbsp;the show is called &amp;nbsp;&lt;A href="http://www.microsoft.com/emea/msdnshowtime/result_search.aspx?event=39&amp;amp;x=22&amp;amp;y=4"&gt;.NET 3.0 (WinFX) Tour&lt;/A&gt;&amp;nbsp;and was recorded in Rotterdam (Netherlands). The show covers Windows Presentation&amp;nbsp;Foundation (WPF), Windows Communication Foundation (WCF), InfoCard and Windows Workflow Foundation (WF).&amp;nbsp;There are two shows with a total of almost 2 hours of info.&lt;/P&gt;
&lt;P&gt;The first show (50 min), presented by Ami Vora,&amp;nbsp;starts with an introduction to .NET 3.0 followed by a small demo of InfoCard. I must admit that this was the first time I really took time to listen/read about what InfoCard is all about, and I was a bit surprised... My impression from this show was that it looks like an advanced version of Passport. The main part of the show (25 min) is about WCF and the most of the time is spent on creating a small demo application by live coding.&lt;/P&gt;
&lt;P&gt;The second show (1 hour) is about WF and WPF. &lt;A href="http://blogs.msdn.com/clemensv/"&gt;Clemens Vaster&lt;/A&gt; is the presenter for WF and I think he makes a good case for WF. However, I think the demo coding (30 min) was not as structured as I would have liked it to be, I was having problems understanding exactly what he was doing and why. The WF stuff gets hidden in all the coding and talking. In the end there is 10 min on WPF presented by Paul Tallet, which to me felt as too short!&lt;/P&gt;
&lt;P&gt;One thing I did learn during Clemens demo was that there is a static method on System.String called IsNullOrEmpty. Using this method eliminate the errors you can do when writing &lt;FONT face="Courier New"&gt;if(str == null&amp;nbsp;|| str.Length&amp;nbsp;== 0)&lt;/FONT&gt;.&lt;/P&gt;
&lt;P&gt;As I'm someone who focuses on distributed applications and BizTalk I found the WCF and WF information most interesting, even though I had heard most of it before. If you like to learn more about .NET 3.0 (WinFx) I think this is a good introduction, specifically I think the first part is very good.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=694139" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattlind/archive/tags/.NET+Framework/default.aspx">.NET Framework</category></item><item><title>traceHelper: Multi-level tracing to OutputDebugString and file</title><link>http://blogs.msdn.com/mattlind/archive/2006/07/17/667640.aspx</link><pubDate>Mon, 17 Jul 2006 12:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:667640</guid><dc:creator>mattlind</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/mattlind/comments/667640.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattlind/commentrss.aspx?PostID=667640</wfw:commentRss><description>&lt;P&gt;The third and final (for now) support class I wish to describe is called traceHelper,&amp;nbsp;as the name suggests this class helps you to include tracing capabilities in your applications. It allows you to use a multi-level trace system where you at run-time can control how much of the trace information is outputted.&lt;/P&gt;
&lt;P&gt;In its simplest usage this class&amp;nbsp;is simply a wrapper around System.Diagnostics.Trace, but is can also be used to trace to file while controlling the amount of trace that is written to the log (using the traceLevel feature).&lt;/P&gt;
&lt;P&gt;Please note that this class has a dependency on the configurationHelper class, which is described and can be downloaded &lt;A href="http://blogs.msdn.com/mattlind/archive/2006/07/10/661682.aspx"&gt;here&lt;/A&gt;. If you wish to use some other configuration tool you will have to modify the code!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Sample Usage&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;void SomeMethod(int maxRows) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; traceHelper.WriteLine(3, "SomeMethod: Entry"); &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(maxRows &amp;lt; 1) &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;&amp;nbsp;traceHelper.WriteLine(2, "SomeMethod: Warning: maxRows was &amp;lt;1, defaulting to 1"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; maxRows = 1; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // do something &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(Exception ex) &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; traceHelper.WriteLine(1, "SomeMethod: Error retrieving data from database: " + ex.ToString()); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/FONT&gt; &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Using traceLevels&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Trace levels are positive numbers with no restriction to any hard-coded values, use whatever you like. However, I always try to use the following guidelines for trace levels:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;1 - Errors: Used in catch-blocks and before returning error codes to callers. 
&lt;LI&gt;2 - Warnings: I have to admit I don't use this much, but when needed it's there. 
&lt;LI&gt;3 - Information: Interesting stuff that may help to understand the flow of the application when "debugging" in a production environment. Examples are: high-level method entry/exit and&amp;nbsp;useful data which can be used to understand how the application executes. 
&lt;LI&gt;5 - Very Detailed Information: Things that will not be interesting to other people than the developer of the specific code. Examples are: method execution times (using timerHelper), chosen case-statement in a switch and low-level method entry/exit. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Controlling Trace Output&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;traceHelper will always trace using System.Diagnostics.Trace (which ultimately calls OutputDebugString) and it can optionally also log to a file. You can specify the path to the log file as well as the base filename, but traceHelper will&amp;nbsp; append the date and time (formatted as yyyyMMddTHHmmss) along with the process id of the tracing application. I always use DebugView from &lt;A href="http://sysinternals.com"&gt;sysinternals.com&lt;/A&gt; to view trace output.&lt;/P&gt;
&lt;P&gt;You may control the maximum size of each trace file as well as the maximum total trace size (sum of all trace files), when the max size of a single trace file is reached a new file is created. The max total trace size is useful to ensure that the log files don't fill the disk.&lt;/P&gt;
&lt;P&gt;During the development phase of a project there is an&amp;nbsp;inconvenience related to the max total trace size... Checking and removal of old trace files is only performed a trace file reaches max size. This means that when you during development (and test) constantly restart your application you will always get a new trace file and the max size is never reached. As a result you may have 100 0.5 MB files even though max total size is 20 MB, but as soon as a single file reaches the 1 MB limit trace files will be removed to ensure that only 20 MB is used in total. However, in a production environment this should not be a problem as you don't restart the application all the time.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Configuration for traceHelper&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Below is a sample config-file (to be parsed by configurationHelper) which controls some of the settings for traceHelper.&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt; &lt;BR&gt;&amp;lt;configurationHelper&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appSettings&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appSetting name="traceHelper.TraceEnabled" value="true" /&amp;gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appSetting name="traceHelper.TraceLevel" value="3" /&amp;gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appSetting name="traceHelper.File.Enabled" value="true" /&amp;gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appSetting name="traceHelper.File.Filename" value="MyApplication" /&amp;gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appSetting name="traceHelper.File.Path" value="C:\Temp\" /&amp;gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appSetting name="traceHelper.File.MaxFileSizeInMb" value="5" /&amp;gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appSetting name="traceHelper.File.MaxTotalFileSizeInMb" value="20" /&amp;gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/appSettings&amp;gt; &lt;BR&gt;&amp;lt;/configurationHelper&amp;gt;&lt;/FONT&gt; &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Conclusion&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;I find this class very useful (hence sharing it with you) as I can add any amount of tracing to my application and then turn everything off but the essential stuff, and if I need more information I can turn it on at any time I choose. But what makes it really useful is the ability to also log to file, that way you can go back a few hours or days and see what caused a problem without having to try to reproduce it.&lt;/P&gt;
&lt;P&gt;When debugging in test or production systems I usually use DebugView to monitor the trace live on one machine and when an error occur I use the log files from the other machines to see what they were doing at the same time.&lt;/P&gt;
&lt;P&gt;I hope you find this class as useful as I do.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=667640" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/mattlind/attachment/667640.ashx" length="6897" type="application/octet-stream" /><category domain="http://blogs.msdn.com/mattlind/archive/tags/.NET+Framework/default.aspx">.NET Framework</category></item><item><title>configurationHelper: Easy to use config-store</title><link>http://blogs.msdn.com/mattlind/archive/2006/07/10/661682.aspx</link><pubDate>Mon, 10 Jul 2006 23:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:661682</guid><dc:creator>mattlind</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/mattlind/comments/661682.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattlind/commentrss.aspx?PostID=661682</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Verdana&gt;configurationHelper is the second utility class I will discuss, it provides a simple and flexible configuration system that do not require you to predefine configuration entities in a schema. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;STRONG&gt;Location of config-file&lt;BR&gt;&lt;/STRONG&gt;The configuration information is stored as key-value pairs in an XML file. The file is stored on disk and the location of the file is stored in the Registry, when the configuration information is first accessed it is read from disk and cached as a static field.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;For each customer where I implement this I customize the Registry key to match the company name, hence I have used Contoso in the example below. The filename is stored in the default value for the key &lt;FONT face="Courier New"&gt;HKLM\Software\Contoso\Configuration&lt;/FONT&gt;, and it is a complete path and filename.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;STRONG&gt;Access configuration values&lt;/STRONG&gt;&lt;BR&gt;All access to configuration information is done using calls to a static property, so there is no need to create instances of the class. Here is a typical example of accessing config information: &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;string level = configurationHelper.AppSettings["traceHelper.TraceLevel"];&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;All configuration values are strings, so if you wish to store integers or boolean values you will have to convert them to their proper type. Typically this can be done using &lt;FONT face="Courier New"&gt;Convert.ToInt32(configValue)&lt;/FONT&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;STRONG&gt;Format of config-file&lt;/STRONG&gt;&lt;BR&gt;As mentioned above the configuration information is in the form of key-value pairs. All keys that are inserted will automatically be available to users, there is no need to register a config key in a schema or anything like that. An example of a config-file is:&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&amp;lt;configuration&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;appSettings&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This section contains configuration realted to tracing.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; To disable trace completely set traceHelper.TraceEnabled to false.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appSetting name="traceHelper.TraceEnabled" value="true" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appSetting name="traceHelper.TraceLevel" value="5" /&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/appSettings&amp;gt;&lt;BR&gt;&amp;lt;/configuration&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;STRONG&gt;Reloading values when config-file is updated&lt;/STRONG&gt;&lt;BR&gt;Even though the configuration information is cached it is very dynamic. During initialization it creates a FileSystemWatcher which monitors changes to the config-file, and if it is updated the contents is reloaded. This means that if you change, add or remove a value it will immediately take affect. At least this works for windows applications and web applications, but when I used it in a BizTalk (2004) project it did not reload when the file was changed. I have no explanation for this behavior (perhaps it’s related to security/privileges) but now you know that there might be a problem…&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;STRONG&gt;Pros and cons&lt;BR&gt;&lt;/STRONG&gt;I find the biggest advantage of this class to be its flexibility and ability to be used in many different types of applications. When a developer needs a new configuration value he simply adds it to the config-file.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;The flexibility may also be a disadvantage when working in a multi-developer multi-server environment. When a developer adds a new configuration value it might affect all developers and if the application is in production the change has to be migrated to multiple servers.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;You can also consider access to config-info a security issues, especially if you keep username and/or passwords in clear-text. You can always use ACLs on the config-file, but the real solution is to NEVER store sensitive information unecrypted regardless if the storage is a file or a database.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;Having a central storage of configuration information would make it simpler in some cases. If you consider central storage a requirement then you should look at the Enterprise Library, it’s more complex but also allows for less flexibility. &lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=661682" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/mattlind/attachment/661682.ashx" length="7288" type="application/octet-stream" /><category domain="http://blogs.msdn.com/mattlind/archive/tags/.NET+Framework/default.aspx">.NET Framework</category></item><item><title>timerHelper: Provides high-precision timing</title><link>http://blogs.msdn.com/mattlind/archive/2006/06/26/641344.aspx</link><pubDate>Mon, 26 Jun 2006 12:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:641344</guid><dc:creator>mattlind</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/mattlind/comments/641344.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattlind/commentrss.aspx?PostID=641344</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;The first utility class I intend to describe is timerHelper. The purpose of this class is to provide a high-precision timing function. Please note that it is not a timer that issues events, instead is used to measure how long something has taken to execute. The purpose of providing an additional timer (there are several available in .NET Framework) is that this implementation provides more accurate timings.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;I use it to time frequently called or long-running methods in my code to gain an understanding of how long these tasks take. With the new code profiling features of Visual Studio 2005 you can get this information during system testing, however using the timerHelper class you can get the timings even in a production environment which may help you understand where your bottlenecks are in a live system. Also, I sometimes think that the VS profiling provides you with too much information to drill down into (which also is a good thing).&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;Another reason I prefer this class over VS profiling is that I can use it in any type of application; windows app, windows service, web, BizTalk, MIIS, etc. Most of my projects involve BizTalk and there is no profiling support for BizTalk.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;The implementation is based on a utility class got sent to me on a mailing alias in September 2001. I took that class and made a few simplifications, e.g. removing some statistical functions. Over the years the class has only had minor changes made to it, and just recently I made it even simpler to use by starting the timer in the constructor (previously you had to call Start).&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;Typically the class is used like this:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face="Courier New" size=2&gt;timerHelper timer = new timerHelper();&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face="Courier New" size=2&gt;// Execute some code here which should be timed!&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face="Courier New" size=2&gt;Trace.WriteLine("m&lt;I style="mso-bidi-font-style: normal"&gt;ethodname&lt;/I&gt;: Duration:&amp;nbsp;" + timer.StopDuration() +&amp;nbsp;" ms");&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&lt;/FONT&gt;&lt;/o:p&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;There some more "advanced" scenarios where you stop and get the duration multiple times, thereby getting partial and complete timings. Each call to Stop will only timestamp the end time, the start time remains the same, so by not restarting the timer you can get "lap times" while still getting the full "race" time.&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&lt;/FONT&gt;&lt;/o:p&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;The actual implementation of timerHelper is an encapsulation of the Win32 APIs QueryPerformanceCounter and QueryPerformanceFrequency. &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;You can find the implementation file as an attachment. Download it and give it a go!&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;An alternative implementation can be found at &lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenethowto09.asp"&gt;&lt;FONT face=Verdana&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenethowto09.asp&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana&gt;. I guess we have started from the same file back in 2001 as the basic design is identical to my class. However, this class uses nanoseconds instead of milliseconds so if you need extreme precision this might be an option. For me milliseconds are just fine as I mostly time things that are in the millisecond range (if not even seconds).&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;[Update]:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;As Richard noted in his comment .NET 2.0 provides us with the System.Diagnostics.Stopwatch class, which does essentially the same thing. &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;Read more here: &lt;/FONT&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx" target=_new rel=nofollow&gt;&lt;FONT face=Verdana color=#770000&gt;http://msdn2.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana&gt; &lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=641344" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/mattlind/attachment/641344.ashx" length="3057" type="application/octet-stream" /><category domain="http://blogs.msdn.com/mattlind/archive/tags/.NET+Framework/default.aspx">.NET Framework</category></item><item><title>Utility classes for timing, tracing and configuration</title><link>http://blogs.msdn.com/mattlind/archive/2006/06/26/641333.aspx</link><pubDate>Mon, 26 Jun 2006 11:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:641333</guid><dc:creator>mattlind</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mattlind/comments/641333.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattlind/commentrss.aspx?PostID=641333</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;In a series of four articles (including this) I will discuss three utility classes that I frequently use when I as a consultant write code for my customers. These classes have been in development for a long time, timerHelper since 2001 and the other for a couple of years, and most times I have used them in a project they have been extended and bugs have been fixed. The classes I will discuss are:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0cm" type=disc&gt;
&lt;LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;&lt;FONT face=Verdana&gt;timerHelper: High-precision timer class. Used to measure duration of millisecond operations.&lt;/FONT&gt; 
&lt;LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;&lt;FONT face=Verdana&gt;configurationHelper: Easy to use configuration store, can be shared among multiple applications.&lt;/FONT&gt; 
&lt;LI class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;&lt;FONT face=Verdana&gt;traceHelper: Support for multi-level tracing which can write to both OutputDebugString and to file.&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;The functionality of two of these classes, configurationHelper and traceHelper, are at least partially available in the Enterprise Library for .NET Framework 2.0 (EL). Why have I, as a &lt;?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /&gt;&lt;st1:PersonName w:st="on"&gt;Microsoft&lt;/st1:PersonName&gt; employee, choosen not to use EL? The reason is simple, EL is big and complex while my classes are extremely light-weight and easy to use. If the customer I work with already have chosen to use a utility framework (either EL or something else) I will have no problem using that (but hasn’t happened yet :-). &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;I admit that using these classes has an element of "not invented here", when someone suggests something else I make an argument for my classes. But if I can get other people to accept the simplicity of my classes then I guess they must have something that is worth having. &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;I intend to include source code for all three of these classes. And while all have been used in production environments for a while I make no guarantees of functionality (proper disclaimer will be included!).&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Verdana&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Verdana&gt;The first class discussed will be timerHelper. Next up is the configurationHelper and last will be the traceHelper. The reason for this order is that timerHelper is simplest so it's easiest to start with, and as traceHelper uses configurationHelper it cannot be discussed before that class.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=641333" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattlind/archive/tags/.NET+Framework/default.aspx">.NET Framework</category></item><item><title>Confusion among developers: .NET Framework vs. CLR versions</title><link>http://blogs.msdn.com/mattlind/archive/2006/06/21/641389.aspx</link><pubDate>Wed, 21 Jun 2006 16:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:641389</guid><dc:creator>mattlind</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mattlind/comments/641389.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattlind/commentrss.aspx?PostID=641389</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Verdana&gt;As you have already heard it was annonced some two weeks ago that WinFX will now be called .NET Framework 3.0.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;While it might make sense from a markering perspective to do this it will probably create confusion among developers. The reason is that .NET Fx 3.0 will contain Common Language Runtime (CLR) 2.0 along with C# 2.0 and other components of the .NET Framework 2.0. In essence, .NET Fx 3.0 is .NET Fx 2.0 extended with a set of new libraries for WCF, WF, WPF and InforCard.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;The problem with decoupling&amp;nbsp;the .NET Fx version from the CLR version is that it becomes &lt;SPAN style="FONT-FAMILY: Verdana"&gt;ambiguous &lt;/SPAN&gt;what we mean when we say .NET.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;Up to now it has been quite easy to understand which component of .NET belongs to which version. A statement like "I'm running .NET 1.1" clearly identify CLR version and Framework version. In the future when you hear "I'm running .NET 3.0" you will have to ask if it's .NET Fx 3.0 or CLR 3.0 (which may be part of .NET Fx 4.0).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;And it's not like we haven't had this problem before. In the mid-90s Microsoft skipped versions in Visual C++ to syncronize Visual C++, MFC and Visual Studio version numbers. And who doesn't remember the more recent talk about Windows .NET Server, Office .NET&amp;nbsp;and .NET Enterprise Servers a couple of years ago when everything should be .NET.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;Those of us who continue working with .NET Framework and CLR will see if the versions will diverge or converge. But for now (and a couple of years ahead) we will have to practice causion and not draw immediate conclusions about which version of .NET Fx and CLR people are talking about.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=641389" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattlind/archive/tags/.NET+Framework/default.aspx">.NET Framework</category></item><item><title>Library for creating MIME messages</title><link>http://blogs.msdn.com/mattlind/archive/2006/06/19/636675.aspx</link><pubDate>Mon, 19 Jun 2006 12:13:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:636675</guid><dc:creator>mattlind</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mattlind/comments/636675.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattlind/commentrss.aspx?PostID=636675</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Verdana&gt;A tool that I have recently made use of is a library from Code Project. The library helped me to easily build MIME messages. As I was providing a high-level API to another caller I created a wrapper around the specific classes and methods exposed by this library.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;The library can be found at &lt;/FONT&gt;&lt;A href="http://www.codeproject.com/useritems/MIME_De_Encode_in_C_.asp"&gt;&lt;FONT face=Verdana&gt;http://www.codeproject.com/useritems/MIME_De_Encode_in_C_.asp&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana&gt;. If you need to create MIME messages then check this out!&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=636675" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattlind/archive/tags/.NET+Framework/default.aspx">.NET Framework</category></item><item><title>PInvoke.net</title><link>http://blogs.msdn.com/mattlind/archive/2006/06/15/632099.aspx</link><pubDate>Thu, 15 Jun 2006 14:48:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:632099</guid><dc:creator>mattlind</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mattlind/comments/632099.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattlind/commentrss.aspx?PostID=632099</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Verdana&gt;During my adventures in CryptoAPI land I found a web site that has helped me to create appropriate P/Invoke declarations. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;The site is called &lt;A href="http://www.pinvoke.net"&gt;www.pinvoke.net&lt;/A&gt;&amp;nbsp;and it contains P/Invoke declarations for a large number of Win32 APIs (always in C# and sometimes in VB) as well as a few examples. &lt;/FONT&gt;&lt;FONT face=Verdana&gt;Even though not all Win32 APIs can be found there I found most of the ones I was looking for.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;A great resource!&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;An example:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;[DllImport("CRYPT32.DLL", EntryPoint="CertOpenStore", CharSet=CharSet.Auto, SetLastError=true)]&lt;BR&gt;public static extern IntPtr CertOpenStoreIntPtrPara( int storeProvider, int encodingType, IntPtr hcryptProv, int flags, IntPtr pvPara);&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=632099" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattlind/archive/tags/.NET+Framework/default.aspx">.NET Framework</category></item><item><title>First post</title><link>http://blogs.msdn.com/mattlind/archive/2006/06/13/630040.aspx</link><pubDate>Wed, 14 Jun 2006 00:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:630040</guid><dc:creator>mattlind</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mattlind/comments/630040.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mattlind/commentrss.aspx?PostID=630040</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Verdana&gt;There are lots of interesting stuff happening right now! Primarily I'm thinking about BizTalk Server 2006 R2 and .NET Framework 3.0 which was both announced last week. Therefore I felt that this was a great time start blogging, lots of news to keep the interest up (both for me and for any readers).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;BizTalk Server 2006 R2 will improve several areas of BizTalk, among those are built-in support for EDI/AS2 and RFID. Current version has a Base EDI adapter but the new functionality will provide a more complete implementation. Read more at &lt;/FONT&gt;&lt;A href="http://www.microsoft.com/presspass/press/2006/jun06/06-06EtEBusinessProcessPR.mspx"&gt;&lt;FONT face=Verdana&gt;http://www.microsoft.com/presspass/press/2006/jun06/06-06EtEBusinessProcessPR.mspx&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana&gt;. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;.NET Framework 3.0 was announced on Friday at &lt;/FONT&gt;&lt;A href="http://blogs.msdn.com/somasegar/archive/2006/06/09/624300.aspx"&gt;&lt;FONT face=Verdana&gt;http://blogs.msdn.com/somasegar/archive/2006/06/09/624300.aspx&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Verdana&gt;, the poster is the Corporate VP of the Microsoft Developer Division. In short Microsoft has decided to&amp;nbsp;offically name what was previously called WinFX to .NET Framework&amp;nbsp;3.0. WinFX&amp;nbsp;consists of technologies such as Windows Presentation Foundation (WPF, previously Avalon), Windows Communication Foundation (WCF, previously Indigo), Windows Workflow Foundation (WF) and the components from .NET Framework 2.0 (CLR 2.0, ADO.NET, etc.).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;I'm sure both of these are topic to revisit in coming weeks and months.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=630040" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mattlind/archive/tags/BizTalk/default.aspx">BizTalk</category><category domain="http://blogs.msdn.com/mattlind/archive/tags/.NET+Framework/default.aspx">.NET Framework</category></item></channel></rss>