<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://chriskirby.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>Chris Kirby&amp;#39;s Inner Monolog : Coding</title><link>http://chriskirby.net/archive/tags/Coding/default.aspx</link><description>Tags: Coding</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Building a raw xml request for a RESTful WCF Service operation which accepts a Generic DataContract type</title><link>http://chriskirby.net/archive/2008/01/18/building-a-raw-xml-request-for-a-restful-wcf-service-operation-which-accepts-a-generic-datacontract-type.aspx</link><pubDate>Sat, 19 Jan 2008 00:44:00 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:240</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=240</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=240</wfw:comment><comments>http://chriskirby.net/archive/2008/01/18/building-a-raw-xml-request-for-a-restful-wcf-service-operation-which-accepts-a-generic-datacontract-type.aspx#comments</comments><description>&lt;p&gt;I wanted to post my experiences with WebInvoke using generic DataContract's as parameters, because I found so little information on the subject via MSDN and throughout the interweb. Specifically, on how to properly formulate a non WCF client XML POST request in this scenario. I will not be focusing on how to host and configure the service (&lt;a href="http://www.developer.com/net/article.php/3695436" mce_href="http://www.developer.com/net/article.php/3695436"&gt;creating REST based services and endpoints in WCF&lt;/a&gt;), since I found plenty of information available in that area via blogs and msdn documentation. &lt;/p&gt; &lt;p&gt;Lets start with the following service contract and corresponding data contract types:&lt;/p&gt; &lt;p&gt;&lt;pre style="overflow: scroll; background-color: #f2f2f2;"&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;[DataContract(Namespace &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"http://chriskirby.net/examples/blog/data"&lt;/span&gt;)]
&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;class&lt;/span&gt; BlogPost
{
	[DataMember]
	&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt; Title;
	
	[DataMember]
	&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt; Body;
	
	[CollectionDataContract(Name &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Tags"&lt;/span&gt;, ItemName &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Tag"&lt;/span&gt;)]
	&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt;[] Tags;
	
	[DataMember]
	&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; DateTime PubDate;
}

[DataContract(Name &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"BlogCreateRequestOf{0}"&lt;/span&gt;, Namespace &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"http://chriskirby.net/examples/blog"&lt;/span&gt;)]
&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;class&lt;/span&gt; BlogCreateRequest&amp;lt;BlogDataType&amp;gt;
{
	[DataMember(Order &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 1)]
	&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt; Username;
	
	[DataMember(Order &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 2)]
	&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt; Password;
	
	[DataMember(Order &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 3)]
	&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; BlogDataType Data;
}

[ServiceContract(Name &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"ExampleBlogService"&lt;/span&gt;, Namespace &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"http://chriskirby.net/examples/blog"&lt;/span&gt;)]
&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;interface&lt;/span&gt; IBlogService
{
	[OperationContract]
	[WebInvoke(Method &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"POST"&lt;/span&gt;, 
		BodyStyle &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; WebMessageBodyStyle.Bare, 
		RequestFormat &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; WebMessageFormat.Xml, 
		ResponseFormat &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; WebMessageFormat.Xml, 
		UriTemplate &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"/CreateBlogPost"&lt;/span&gt;)]
	&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;bool&lt;/span&gt; CreateBlogPost(BlogCreateRequest&amp;lt;BlogPost&amp;gt; request);
}&lt;/span&gt;&lt;/pre&gt;&lt;/BlogPost&gt;&lt;/BlogDataType&gt;&lt;/p&gt; &lt;p&gt;As you can see above, the operation CreateBlogPost on the service contract IBlogService returns a boolean and accepts the type BlogCreateRequest&amp;lt;BlogPost&amp;gt; as its input. To the outside world via wsld or IMetadataExchange, the operation CreateBlogPost accepts schema type BlogCreateRequestOfBlogPost with a default namespace of &lt;a href="http://chriskirby.net/examples/blog" mce_href="http://chriskirby.net/examples/blog"&gt;http://chriskirby.net/examples/blog&lt;/a&gt;, however, the Data property is of schema type BlogPost with a namespace of &lt;a href="http://chriskirby.net/examples/blog/data" mce_href="http://chriskirby.net/examples/blog/data"&gt;http://chriskirby.net/examples/blog/data&lt;/a&gt;. To formulate the request properly, you need to make sure each node in the xml request is of the correct namespace, otherwise the DataContractSerializer will not recognize you request on deserialization, and WCF will return a 400 error (Bad Request). I've also used several notable DataContract and DataMember properties in order to control how the type looks to the outside world (serialized). On the BlogCreateRequest generic class I specified the name of BlogCreateRequestOf{0}, which in this case translates to BlogCreateRequestOfBlogPost. If I chose not so specify the name using the placeholder, the DataContractSerializer would serialize the type with a name like BlogCreateRequestOfBlogPost4sdop, where the suffix is comprised of a series of random characters to ensure that the type has a unique name. However, I know that my service will not use any other types by that name, so I can safely specify it for ease of used to the client. I also used the Order property, which is pretty self explanatory, it simply ensures that the serializer will use the same order I specified in my class definition. Finally, I decorated the Tags property on BlogPost with the CollectionDataContract attribute which allows me to specify how I want the collection formatted by serializer, e.g. &amp;lt;Tags&amp;gt;&amp;lt;Tag/&amp;gt;&amp;lt;Tag/&amp;gt;&amp;lt;/Tags&amp;gt;.&lt;/p&gt; &lt;p&gt;Formulating the request:&lt;/p&gt; &lt;p&gt;&lt;pre style="overflow: scroll; background-color: #f2f2f2;"&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;XmlWriterSettings settings &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;new&lt;/span&gt; XmlWriterSettings();
settings.Indent &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;false&lt;/span&gt;;
settings.OmitXmlDeclaration &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;true&lt;/span&gt;;
settings.CloseOutput &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;true&lt;/span&gt;;
settings.ConformanceLevel &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; ConformanceLevel.Document;
settings.Encoding &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; Encoding.UTF8;

StringBuilder fileStringBuilder &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;new&lt;/span&gt; StringBuilder();
XmlWriter writer &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; XmlTextWriter.Create(fileStringBuilder, settings);

writer.WriteRaw(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;@"&amp;lt;?xml version=""1.0"" encoding=""utf-8""?&amp;gt;"&lt;/span&gt;);
writer.WriteStartElement(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"BlogCreateRequestOfBlogPost "&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"http://chriskirby.net/examples/blog"&lt;/span&gt;);
writer.WriteElementString(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Username"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"TestUser"&lt;/span&gt;);
writer.WriteElementString(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Password"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"TestPassword"&lt;/span&gt;);
writer.WriteStartElement(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Data"&lt;/span&gt;);

writer.WriteElementString(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Title"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"http://chriskirby.net/examples/blog/data"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"XML Post to WCF REST Service"&lt;/span&gt;);
writer.WriteElementString(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Body"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"http://chriskirby.net/examples/blog/data"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Blah Blah Blah"&lt;/span&gt;);
writer.WriteStartElement(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Tags"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"http://chriskirby.net/examples/blog/data"&lt;/span&gt;);
writer.WriteElementString(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Tag"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"http://chriskirby.net/examples/blog/data"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;".Net"&lt;/span&gt;);
writer.WriteElementString(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Tag"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"http://chriskirby.net/examples/blog/data"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"WCF"&lt;/span&gt;);
writer.WriteEndElement();
writer.WriteElementString(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"PubDate"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"http://chriskirby.net/examples/blog/data"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"01/18/2008"&lt;/span&gt;);

writer.WriteEndDocument();

WebClient webClient &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;new&lt;/span&gt; WebClient();
webClient.Headers.Add(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Content-Type"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"application/xml; charset=utf-8"&lt;/span&gt;);

&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;string&lt;/span&gt; response &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; webClient.UploadString(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"https://chriskirby.net/services/blog/CreateBlogPost"&lt;/span&gt;, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"POST"&lt;/span&gt;, fileStringBuilder.ToString());&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt; &lt;p&gt;The tricky part here is really just understanding how the DataContractSerializer works... which now, after hours of debugging, I now have a much better understanding of. The key points of understanding for me were discovering how to assign the correct namespace to the corresponding node as well as figuring out how the serializer organized generic types, specifically my generic type CreateBlogRequest&amp;lt;&amp;gt;. During your first glace at the service and data contract code block, you may have thought as id did in that the Data property/element would be in the &lt;a href="http://chriskirby.net/examples/blog/data" title="http://chriskirby.net/examples/blog/data" mce_href="http://chriskirby.net/examples/blog/data"&gt;http://chriskirby.net/examples/blog/data&lt;/a&gt; namespace, since it is in fact of type BlogPost...however, the Data property is first an foremost a part of the BlogCreateRequest type, so it must be a part of the class namespace and not the namespace of its generically assigned type. My second, and ultimately incorrect thought, was that the structure would look like &amp;lt;Data&amp;gt;&amp;lt;BlogPost&amp;gt;&amp;lt;Title/&amp;gt;....&amp;lt;/&amp;gt;. But after careful thought, that would mean Data would be of a type which had BlogPost as a member, which is not the case here. Its also worth noting there are several other ways of formatting the xml request to get the same result. The most common would be to declare both namespaces in the root element and assign them prefixes, you would then use those prefixes to denote the namespace in each element in the document.&lt;/p&gt; &lt;p&gt;So there you have it...The simple and sometimes complicated power of WCF. I look forward to many more &lt;span style="text-decoration: line-through;"&gt;headaches&lt;/span&gt; adventures in the near future.&lt;/p&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=240" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/cSharp/default.aspx">cSharp</category><category domain="http://chriskirby.net/archive/tags/XML/default.aspx">XML</category><category domain="http://chriskirby.net/archive/tags/WCF/default.aspx">WCF</category></item><item><title>Visual Studio 2008 is GOLD and available on MSDN!</title><link>http://chriskirby.net/archive/2007/11/19/visual-studio-2008-is-gold-and-available-on-msdn.aspx</link><pubDate>Mon, 19 Nov 2007 22:22:22 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:233</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=233</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=233</wfw:comment><comments>http://chriskirby.net/archive/2007/11/19/visual-studio-2008-is-gold-and-available-on-msdn.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msdn2.microsoft.com/en-us/subscriptions/bb608344.aspx"&gt;The wait is over&lt;/a&gt;, and I still can't wait! The only issue I'm going have with the upgrade at this point is that &lt;a href="http://www.sourcegear.com/fortress/index.html" target="_blank"&gt;Fortress&lt;/a&gt; is not going to support 2008 integration until version 1.1/4.1, which unfortunately is still several weeks out according to their support site. At least the folks at &lt;a href="http://jetbrains.com" target="_blank"&gt;Jetbrains&lt;/a&gt; were on the ball...&lt;a href="http://www.jetbrains.com/resharper/index.html" target="_blank"&gt;resharper&lt;/a&gt; already has &lt;a href="http://www.jetbrains.net/confluence/display/ReSharper/Download" target="_blank"&gt;experimental support&lt;/a&gt; for us immediate adopters.&lt;/p&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=233" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/Software/default.aspx">Software</category><category domain="http://chriskirby.net/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://chriskirby.net/archive/tags/cSharp/default.aspx">cSharp</category></item><item><title>.Net 3.0 Framwork baked and now standing</title><link>http://chriskirby.net/archive/2006/11/08/.Net-3.0-Framwork-baked-and-now-standing_5F00_193.aspx</link><pubDate>Tue, 07 Nov 2006 23:20:50 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:219</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=219</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=219</wfw:comment><comments>http://chriskirby.net/archive/2006/11/08/.Net-3.0-Framwork-baked-and-now-standing_5F00_193.aspx#comments</comments><description>&lt;!-- Generated by XStandard version 1.7.0.0 on 2006-11-07T16:43:24 --&gt;&lt;p&gt;The RTM download for the .Net 3.0 Framework is now &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=10CC340B-F857-4A14-83F5-25634C3BF043&amp;amp;displaylang=en" target="wookie_new"&gt;available for download&lt;/a&gt; on MSDN! And, the VS 2005 extensions for &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=5D61409E-1FA3-48CF-8023-E8F38E709BA6&amp;amp;displaylang=en" target="wookie_new"&gt;Windows Workflow Foundation&lt;/a&gt; (WWF), &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=F54F5537-CC86-4BF5-AE44-F5A1E805680D&amp;amp;displaylang=en" target="wookie_new"&gt;Windows Communication Foundation&lt;/a&gt; (WCF), and &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=F54F5537-CC86-4BF5-AE44-F5A1E805680D&amp;amp;displaylang=en" target="wookie_new"&gt;Windows Presentation Foundation&lt;/a&gt; (WPF) have also been released...Though the WCF and WPF extension are still in CTP. &lt;/p&gt;&lt;p&gt;Theres been so many &lt;a href="http://msdn2.microsoft.com/en-us/downloads/default.aspx" target="wookie_new"&gt;new drops&lt;/a&gt; lately that its been hard to keep up...not that i'm complaining ;) Its an exciting time to be a MS/.Net developer.&lt;/p&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=219" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/Software/default.aspx">Software</category><category domain="http://chriskirby.net/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://chriskirby.net/archive/tags/Windows/default.aspx">Windows</category></item><item><title>Asp.net AJAX Beta 1 a showstopper</title><link>http://chriskirby.net/archive/2006/10/31/Asp.net-AJAX-Beta-1-a-showstopper_5F00_190.aspx</link><pubDate>Mon, 30 Oct 2006 23:08:31 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:216</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=216</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=216</wfw:comment><comments>http://chriskirby.net/archive/2006/10/31/Asp.net-AJAX-Beta-1-a-showstopper_5F00_190.aspx#comments</comments><description>&lt;!-- Generated by XStandard version 1.7.0.0 on 2006-10-30T16:43:29 --&gt;&lt;p&gt;I, like &lt;a href="http://forums.asp.net/thread/1441672.aspx" target="wookie_new"&gt;many others&lt;/a&gt;, have just put in the time to migrate my atlas ctp site over to ajax beta 1 only to find out that ajax extender controls no longer work with templated controls!! You've got to be kidding me! I just don't know how this could have slipped past testing, being that its such a major issue. I hate to rag on the dev team being that this is still a beta product, but this bug wasn't present in the last 2 ctp's and now is a major showstopper for me and many others...and unfortunately, the &lt;a href="http://forums.asp.net/thread/1441672.aspx" target="wookie_new"&gt;workaround&lt;/a&gt; that was posted by the team just won't do the trick for the majority of my controls. I'm now left with the lose lose decision of trying to stick it out and hack it together or going back to the July CTP :(&lt;/p&gt;&lt;p&gt;Please guys, get us an update soon!&lt;/p&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=216" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://chriskirby.net/archive/tags/OpenSource/default.aspx">OpenSource</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/Rants/default.aspx">Rants</category><category domain="http://chriskirby.net/archive/tags/Reviews/default.aspx">Reviews</category><category domain="http://chriskirby.net/archive/tags/Software/default.aspx">Software</category></item><item><title>Vista and Framework 3.0 go RC</title><link>http://chriskirby.net/archive/2006/09/11/Vista-and-Framework-3.0-go-RC_5F00_186.aspx</link><pubDate>Mon, 11 Sep 2006 21:30:58 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:212</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=212</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=212</wfw:comment><comments>http://chriskirby.net/archive/2006/09/11/Vista-and-Framework-3.0-go-RC_5F00_186.aspx#comments</comments><description>&lt;!-- Generated by XStandard version 1.7.0.0 on 2006-09-11T14:44:24 --&gt;&lt;p&gt;Vista has finally &lt;a href="http://www.microsoft.com/windowsvista/getready/preview.mspx" target="wookie_new"&gt;gone RC&lt;/a&gt; along with all of the developer goodies that come along with it!&lt;/p&gt;&lt;p&gt;To grab all of the RC1 bits, visit these download links in order.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=AAE7FC63-D405-4E13-909F-E85AA9E66146&amp;amp;displaylang=en" target="wookie_new"&gt;WinFX runtime uninstall tool&lt;/a&gt; (only if you have a ctp or b2 installed)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=19E21845-F5E3-4387-95FF-66788825C1AF&amp;amp;displaylang=en" target="wookie_new"&gt;.Net 3.0 Runtime&lt;/a&gt; (formerly WinFX runtime)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=117ECFD3-98AD-4D67-87D2-E95A8407FA86&amp;amp;displaylang=en" target="wookie_new"&gt;Windows Vistal SDK&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=935AABF9-D1D0-4FC9-B443-877D8EA6EAB8&amp;amp;displaylang=en" target="wookie_new"&gt;.Net 3.0 Developer Extensions&lt;/a&gt; Sept CTP for VS 2005&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=935AABF9-D1D0-4FC9-B443-877D8EA6EAB8&amp;amp;displaylang=en" target="wookie_new"&gt;Windows Workflow Foundation Extensions&lt;/a&gt; RC5 for VS 2005&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=212" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/Software/default.aspx">Software</category><category domain="http://chriskirby.net/archive/tags/Tech/default.aspx">Tech</category><category domain="http://chriskirby.net/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://chriskirby.net/archive/tags/Windows/default.aspx">Windows</category></item><item><title>Insert source code plugin for Windows Live Writer</title><link>http://chriskirby.net/archive/2006/08/22/Insert-source-code-plugin-for-Windows-Live-Writer_5F00_184.aspx</link><pubDate>Tue, 22 Aug 2006 18:13:00 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:210</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=210</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=210</wfw:comment><comments>http://chriskirby.net/archive/2006/08/22/Insert-source-code-plugin-for-Windows-Live-Writer_5F00_184.aspx#comments</comments><description>&lt;p&gt;Last night, I finally got a chance to finish a workable version of my source code formatting plugin for &lt;a href="http://windowslivewriter.spaces.live.com/" title="windows live writer" target="_blank"&gt;Live Writer&lt;/a&gt;. The plugin isn&amp;#39;t quite done yet, but as of now, will let you insert and format C#, VB, Javascript, Html, Xml, and T-Sql, very similar to the functionality available in the Wookie Blog Extension v2 which is also based on the original source code from Jean-Claude Manoli&amp;#39;s &lt;a href="http://www.manoli.net/csharpformat/" title="CSharpFormat Project" target="_blank"&gt;CSharpFormat project&lt;/a&gt;. As for the cross posting support, the api just isn&amp;#39;t there yet...so far, there is only support for content based plugins, but I&amp;#39;m assuming they will add support for more integrated plugins in future releases. You can grab the code plugin using the link below...and, to install, just drop it in your Live Writer plugins directory.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://chrisjkirby.com/files/folders/live_writer_plugins/entry1194.aspx" target="_blank"&gt;Insert Source Code Plugin Beta 1&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=210" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/Blogs/default.aspx">Blogs</category><category domain="http://chriskirby.net/archive/tags/CommunityServer/default.aspx">CommunityServer</category><category domain="http://chriskirby.net/archive/tags/Internet/default.aspx">Internet</category><category domain="http://chriskirby.net/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://chriskirby.net/archive/tags/OpenSource/default.aspx">OpenSource</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/Software/default.aspx">Software</category><category domain="http://chriskirby.net/archive/tags/Windows/default.aspx">Windows</category></item><item><title>dotNetWookie now running CS 2.1</title><link>http://chriskirby.net/archive/2006/08/21/dotNetWookie-now-running-CS-2.1_5F00_183.aspx</link><pubDate>Mon, 21 Aug 2006 19:26:31 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:209</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=209</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=209</wfw:comment><comments>http://chriskirby.net/archive/2006/08/21/dotNetWookie-now-running-CS-2.1_5F00_183.aspx#comments</comments><description>&lt;!-- Generated by XStandard version 1.7.0.0 on 2006-08-21T12:48:45 --&gt;&lt;p&gt;dotNetWookie.com is now up and running with Community Server 2.1!&lt;/p&gt;&lt;p&gt;Wookie users...dont' forget to check out all of the &lt;a href="http://communityserver.org/blogs/announcements/archive/2006/08/09/Community-Server-2.1-Now-Available.aspx" target="wookie_new"&gt;new features&lt;/a&gt; and skins available.&lt;/p&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=209" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/Blogs/default.aspx">Blogs</category><category domain="http://chriskirby.net/archive/tags/CommunityServer/default.aspx">CommunityServer</category><category domain="http://chriskirby.net/archive/tags/Internet/default.aspx">Internet</category><category domain="http://chriskirby.net/archive/tags/OpenSource/default.aspx">OpenSource</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/Software/default.aspx">Software</category><category domain="http://chriskirby.net/archive/tags/Wookie/default.aspx">Wookie</category></item><item><title>Windows Live Writer unleashed.</title><link>http://chriskirby.net/archive/2006/08/14/Windows-Live-Writer-unleashed_2E005F00_181.aspx</link><pubDate>Mon, 14 Aug 2006 16:10:04 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:207</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=207</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=207</wfw:comment><comments>http://chriskirby.net/archive/2006/08/14/Windows-Live-Writer-unleashed_2E005F00_181.aspx#comments</comments><description>&lt;!-- Generated by XStandard version 1.7.0.0 on 2006-08-14T09:41:27 --&gt;&lt;p&gt;A few days ago, Microsoft released beta 1 of a new live product called &lt;a href="http://windowslivewriter.spaces.live.com/" target="wookie_new"&gt;Windows Live Writer&lt;/a&gt;. Its essentially an offline blogging tool that works with &lt;a href="http://spaces.live.com" target="wookie_ new"&gt;live spaces&lt;/a&gt;, or any other popular blog platform, out of the box. &lt;/p&gt;&lt;p&gt;For nearly 2 years now, i've been writing my own blogging tools, simply because there werent any out there which had the features I was looking for...until now. Live writer not only has many of the features i need (support for &lt;a href="http://communityserver.org" target="wookie_new"&gt;community server&lt;/a&gt;, photos, ftp, ping), but has excellent plugin support via &lt;a href="http://download.microsoft.com/download/f/9/a/f9a19f2d-cec4-4a25-9b0b-eb9655ea7561/Windows%20Live%20Writer%20SDK%20(Beta).msi" target="wookie_new"&gt;their api&lt;/a&gt; as well. So, to get Writer just the way i like it, i've already started working on cross-posting, and code formatting plugins to fill is some of the blanks. Once completed, Live Writer should replace the &lt;a href="http://dotnetwookie.com/forums/30/ShowForum.aspx"&gt;Wookie Blog Extension&lt;/a&gt; as my primary offline blogger. Though, I don't plan on killing WBE entirely, future versions will just shift from an all-in-one, to more of an addon to Writer.&lt;/p&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=207" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/Blogs/default.aspx">Blogs</category><category domain="http://chriskirby.net/archive/tags/CommunityServer/default.aspx">CommunityServer</category><category domain="http://chriskirby.net/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/Reviews/default.aspx">Reviews</category><category domain="http://chriskirby.net/archive/tags/Software/default.aspx">Software</category><category domain="http://chriskirby.net/archive/tags/Windows/default.aspx">Windows</category><category domain="http://chriskirby.net/archive/tags/Wookie/default.aspx">Wookie</category></item><item><title>Asp.net 2.0 membership and migrating legacy users</title><link>http://chriskirby.net/archive/2006/06/21/Asp.net-2.0-membership-and-migrating-legacy-users_5F00_174.aspx</link><pubDate>Wed, 21 Jun 2006 16:07:00 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:200</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=200</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=200</wfw:comment><comments>http://chriskirby.net/archive/2006/06/21/Asp.net-2.0-membership-and-migrating-legacy-users_5F00_174.aspx#comments</comments><description>I've encountered many instances lately in which i'm developing a new version of a site with an existing (custom) authentication database. Now, in cases like these, most .net developers would suggest writing your own membership and role providers to tie directly in to the existing schema; however, instead of rolling my own, I've decided to take a different approach in which I simply utilize the events provided with the login control to manually authenticate and migration the legacy accounts in real time. This approach requires considerably less code and allows you to utilize the default providers while still supporting the legacy user database. The event code would look something like this: (*note* that the db code makes use of classes and methods from a custom library)
&lt;pre style="overflow: scroll; background-color: #f2f2f2;"&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;protected&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;void&lt;/span&gt; Login1_Authenticate(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;object&lt;/span&gt; sender, System.Web.UI.WebControls.AuthenticateEventArgs e)
{ &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// first, check to see if the user has already been migrated. if so, then were done here.&lt;/span&gt;
&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;if&lt;/span&gt;(Membership.ValidateUser(Login1.UserName, Login1.Password))
{
e.Authenticated &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;true&lt;/span&gt;;
&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;return&lt;/span&gt;;
}
&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;else&lt;/span&gt;
{
&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// check legacy credentials&lt;/span&gt;
DataParameters parameters &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;new&lt;/span&gt; DataParameters();
parameters.Add(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"@Login"&lt;/span&gt;, SqlDbType.VarChar, Login1.UserName);
parameters.Add(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"@Password"&lt;/span&gt;, SqlDbType.VarChar, Login1.Password);
parameters.Add(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"@Email"&lt;/span&gt;, SqlDbType.VarChar, 50, ParameterDirection.Output);
parameters.Add(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"@UserId"&lt;/span&gt;, SqlDbType.Int, 1, ParameterDirection.Output);
parameters.Add(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"ReturnValue"&lt;/span&gt;, SqlDbType.Int, 1, ParameterDirection.ReturnValue);
DataUtility.ExecuteNonQuery(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"ConnectionString"&lt;/span&gt;, CommandType.StoredProcedure, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"ValidateUser"&lt;/span&gt;, parameters);
&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// if the credentials are good, then migrate to membership&lt;/span&gt;
&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;if&lt;/span&gt;((&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;int&lt;/span&gt;)parameters[&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"ReturnValue"&lt;/span&gt;].Value == 0)
{
&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// migrate the user account&lt;/span&gt;
MembershipCreateStatus status;
MembershipUser newUser &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; Membership.CreateUser(Login1.UserName, Login1.Password, parameters[&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"@Email"&lt;/span&gt;].Value.ToString(), &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"What is your Username?"&lt;/span&gt;, Login1.UserName, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;true&lt;/span&gt;, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;out&lt;/span&gt; status);

&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;if&lt;/span&gt; (status == MembershipCreateStatus.Success)
{
&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// update legacy user with new membership user id, tying the old to the new&lt;/span&gt;
parameters &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;new&lt;/span&gt; DataParameters(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"@UserId"&lt;/span&gt;, SqlDbType.Int, Login1.UserName);
parameters.Add(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"@MembershipUserId"&lt;/span&gt;, SqlDbType.UniqueIdentifier, newUser.ProviderUserKey);
DataUtility.ExecuteNonQuery(&lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"ConnectionString"&lt;/span&gt;, CommandType.StoredProcedure, &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"UpdateUser"&lt;/span&gt;, parameters);
&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Create an empty Profile for the newly created user&lt;/span&gt;
ProfileCommon profile &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; (ProfileCommon)ProfileCommon.Create(Login1.UserName, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;true&lt;/span&gt;);
&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Populate default profile values&lt;/span&gt;
profile.Theme &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"Default"&lt;/span&gt;;
&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;// Save the profile&lt;/span&gt;
profile.Save();
e.Authenticated &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;true&lt;/span&gt;;
&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;return&lt;/span&gt;;
}
&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;else&lt;/span&gt;
Login1.FailureText &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;"We were unable to migrate you user account. Please contact support for further assistance."&lt;/span&gt;;
}
e.Authenticated &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;false&lt;/span&gt;;
}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;So, with the little bit of code above, I'm able to authenticate and migrate legacy user accounts to the new membership system without breaking the existing db schema. It may not be as elegant as writing your own provider, but in my case, it was equally as effective.&lt;/p&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=200" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/Hacks/default.aspx">Hacks</category><category domain="http://chriskirby.net/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://chriskirby.net/archive/tags/OpenSource/default.aspx">OpenSource</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/Software/default.aspx">Software</category><category domain="http://chriskirby.net/archive/tags/cSharp/default.aspx">cSharp</category></item><item><title>The Resharper 2.0 beta has arrived</title><link>http://chriskirby.net/archive/2006/04/27/The-Resharper-2.0-beta-has-arrived_5F00_162.aspx</link><pubDate>Thu, 27 Apr 2006 02:01:18 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:188</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=188</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=188</wfw:comment><comments>http://chriskirby.net/archive/2006/04/27/The-Resharper-2.0-beta-has-arrived_5F00_162.aspx#comments</comments><description>&lt;!-- Generated by XStandard version 1.7.0.0 on 2006-04-26T19:18:09 --&gt;&lt;!-- begin template --&gt;&lt;div style="font-family:courier new;font-size:9pt;padding-bottom:5px;"&gt;&amp;lt;&amp;lt;&lt;a href="http://www.jetbrains.com/resharper/beta20.html" target="wookie_new" title="By JetBrains News"&gt;Resharper 2.0 Beta is here&lt;/a&gt;&lt;/div&gt;&lt;!-- end template --&gt;&lt;p&gt;As of Monday, Resharper 2.0 is finally out of EAP (early access program) and in to Beta! I honestly don't know what I'd do without Resharper, so I've been actively using the EAP builds (for vs 2005) even though they were extremely buggy in the beginning. But...the last 10 builds or so have been getting nice and stable so I'm sure this first beta will not disappoint. So, if you've been waiting, now is the time...and, if you've never tried it before, I highly recommend jumping in now and checking it out.&lt;/p&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=188" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/Reviews/default.aspx">Reviews</category><category domain="http://chriskirby.net/archive/tags/Tech/default.aspx">Tech</category></item><item><title>Get the most out of Master Pages</title><link>http://chriskirby.net/archive/2006/04/20/Get-the-most-out-of-Master-Pages_5F00_160.aspx</link><pubDate>Thu, 20 Apr 2006 00:06:00 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:186</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=186</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=186</wfw:comment><comments>http://chriskirby.net/archive/2006/04/20/Get-the-most-out-of-Master-Pages_5F00_160.aspx#comments</comments><description>&lt;!-- Generated by XStandard version 1.7.0.0 on 2006-04-19T17:32:20 --&gt;&lt;!-- begin template --&gt;&lt;table border="0" cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="font-family: courier new; font-size: 9pt;"&gt;&amp;lt;&amp;lt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://OdeToCode.com/Articles/450.aspx" style="font-family: courier new; font-size: 9pt;" target="wookie_new" title="By Articles"&gt;Master Pages: Tips, Tricks, and Traps&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p style="padding-left: 15px; font-size: 8pt;"&gt;&lt;i&gt;MasterPages are a great addition to the ASP.NET feature set, but are not without their quirks. This article will highlight the common problems developers face with master pages, and provide tips and tricks to use master pages to their fullest potential. &lt;/i&gt;&lt;/p&gt;&lt;!-- end template --&gt;&lt;p&gt;This article really digs in to the inner workings and advance usage of Master Pages. I took quite a few useful things from it...definitely a great read for any .net developer.&lt;/p&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=186" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/Blogs/default.aspx">Blogs</category><category domain="http://chriskirby.net/archive/tags/Internet/default.aspx">Internet</category><category domain="http://chriskirby.net/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://chriskirby.net/archive/tags/OpenSource/default.aspx">OpenSource</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/Reviews/default.aspx">Reviews</category><category domain="http://chriskirby.net/archive/tags/Software/default.aspx">Software</category></item><item><title>The schema and service versioning dilemma</title><link>http://chriskirby.net/archive/2006/04/17/The-schema-and-service-versioning-dilemma_5F00_158.aspx</link><pubDate>Mon, 17 Apr 2006 22:49:31 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:184</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=184</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=184</wfw:comment><comments>http://chriskirby.net/archive/2006/04/17/The-schema-and-service-versioning-dilemma_5F00_158.aspx#comments</comments><description>&lt;!-- Generated by XStandard version 1.7.0.0 on 2006-04-17T16:24:40 --&gt;&lt;!-- begin template --&gt;&lt;table border="0" cellpadding="2" cellspacing="0"&gt;&lt;tr&gt;&lt;td style="font-family:courier new;font-size:9pt;"&gt;&amp;lt;&amp;lt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://pluralsight.com/blogs/tewald/archive/2006/04/14/21733.aspx" style="font-family:courier new;font-size:9pt;" target="wookie_new" title="By XML Nation"&gt;Solving the XSD versioning problem&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;!-- end template --&gt;&lt;p&gt;I would agree, as with most xml and web service developers, that schema and service versioning is a major pain in the ass. In this post by Tim Ewald, he discusses a way to approach this by using a more in-depth approach to validation. The way most of us approach this is simply by throwing the document up against latest known schema, and, if it errors, then the data must be invalid. Well, as well all know, that is usually not the case. Most likely, the document may have been created with a different version and simply contain some minor variations, which, in the end, may not even apply to the data we care about. In those scenarios, his solution suggests that we just get a little more detailed with our validation process...basically ignoring elements we dont understand or care about during validation, and only hiccup a validation error to the sender when its obvious that required data is missing. To my surprise, this type of, per element, validation meta data, is already built into the xsd specification and should be supported by xml processors in .net. I'll definitely look forward to checking out his implementation when he posts the code. &lt;/p&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=184" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/Blogs/default.aspx">Blogs</category><category domain="http://chriskirby.net/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://chriskirby.net/archive/tags/OpenSource/default.aspx">OpenSource</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/Software/default.aspx">Software</category></item><item><title>Wookie Blog Extension v2 Final</title><link>http://chriskirby.net/archive/2006/04/11/Wookie-Blog-Extension-v2-Final_5F00_157.aspx</link><pubDate>Tue, 11 Apr 2006 00:27:00 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:183</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=183</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=183</wfw:comment><comments>http://chriskirby.net/archive/2006/04/11/Wookie-Blog-Extension-v2-Final_5F00_157.aspx#comments</comments><description>&lt;!-- Generated by XStandard version 1.6.2.0 on 2006-04-10T17:30:41 --&gt;&lt;p&gt;The final build of the &lt;a href="http://chrisjkirby.com/forums/30/ShowForum.aspx"&gt;Wookie Blog Extension v2&lt;/a&gt; is now available under &lt;a href="http://chrisjkirby.com/files/8/current_release/default.aspx"&gt;Current Releases&lt;/a&gt; in the Files section. This version just addressed some minor issues that came up with beta 2 and now includes a native &lt;a href="http://spaces.msn.com"&gt;MSN Spaces&lt;/a&gt; plugin with the installation. You can view the complete &lt;a href="http://chrisjkirby.com/forums/thread/973.aspx"&gt;release notes&lt;/a&gt; over in the &lt;a href="http://chrisjkirby.com/forums/30/ShowForum.aspx"&gt;discussion forums&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;All of the plugins are also available for independent download under &lt;a href="http://chrisjkirby.com/files/8/plugins/default.aspx"&gt;Plugins&lt;/a&gt; in the Files section, including the project files and source code for the Community Server and MetaWeblog plugins.&lt;/p&gt;&lt;p&gt;** update ** I've just updated the rtm installer package with the new &lt;a href="http://www.blogger.com"&gt;Blogger&lt;/a&gt; plugin, as well as uploaded the Blogger plugin source and assembly for seperate download.&lt;br&gt;&lt;/p&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=183" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/Blogs/default.aspx">Blogs</category><category domain="http://chriskirby.net/archive/tags/CommunityServer/default.aspx">CommunityServer</category><category domain="http://chriskirby.net/archive/tags/Internet/default.aspx">Internet</category><category domain="http://chriskirby.net/archive/tags/OpenSource/default.aspx">OpenSource</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/Software/default.aspx">Software</category><category domain="http://chriskirby.net/archive/tags/Wookie/default.aspx">Wookie</category></item><item><title>New Gengis for .net 2.0</title><link>http://chriskirby.net/archive/2006/04/03/New-Gengis-for-.net-2.0_5F00_155.aspx</link><pubDate>Mon, 03 Apr 2006 21:38:00 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:181</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=181</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=181</wfw:comment><comments>http://chriskirby.net/archive/2006/04/03/New-Gengis-for-.net-2.0_5F00_155.aspx#comments</comments><description>&lt;!-- Generated by XStandard version 1.6.2.0 on 2006-04-03T14:51:35 --&gt;&lt;p&gt;&lt;a href="http://www.sellsbrothers.com/" target="wookie_new"&gt;Chris Sells&lt;/a&gt; announced a &lt;a href="http://www.gotdotnet.com/Workspaces/Workspace.aspx?id=dfd0b577-2e97-4d21-90c4-6ca9d83e47ad"&gt;new version Gengis&lt;/a&gt; a few days ago on his blog. This new version, 0.6, is now targeted for .net 2.0, and includes many &lt;a href="http://www.sellsbrothers.com/news/showTopic.aspx?ixTopic=1978" target="wookie_new"&gt;new controls&lt;/a&gt;. I was hoping they would continue work on this project, its definitely been of great to help to me in the past...and, now this its out for win forms 2.0, I definitely plan on integrating some of the new controls into the wookie blog extension ui. &lt;/p&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=181" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/OpenSource/default.aspx">OpenSource</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/Software/default.aspx">Software</category></item><item><title>Wookie Blog Extension v2 Beta 2</title><link>http://chriskirby.net/archive/2006/03/28/Wookie-Blog-Extension-v2-Beta-2_5F00_152.aspx</link><pubDate>Tue, 28 Mar 2006 01:03:00 GMT</pubDate><guid isPermaLink="false">fe7bf805-78e2-48d4-8999-041f23e860c0:178</guid><dc:creator>Chris Kirby</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/rsscomments.aspx?PostID=178</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://chriskirby.net/commentapi.aspx?PostID=178</wfw:comment><comments>http://chriskirby.net/archive/2006/03/28/Wookie-Blog-Extension-v2-Beta-2_5F00_152.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://chrisjkirby.com/files/8/beta_releases/entry930.aspx"&gt;Beta 2&lt;/a&gt; is now available over in the &lt;a href="http://chrisjkirby.com/files/default.aspx"&gt;Files section&lt;/a&gt;, and is finally feature complete as of this release. I posted the &lt;a href="http://chrisjkirby.com/forums/thread/931.aspx"&gt;release notes&lt;/a&gt; and a new &lt;a href="http://chrisjkirby.com/forums/thread/929.aspx"&gt;FAQ&lt;/a&gt; to help answer some questions over in the &lt;a href="http://chrisjkirby.com/forums/default.aspx"&gt;forums&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://chriskirby.net/aggbug.aspx?PostID=178" width="1" height="1"&gt;</description><category domain="http://chriskirby.net/archive/tags/.Net/default.aspx">.Net</category><category domain="http://chriskirby.net/archive/tags/Blogs/default.aspx">Blogs</category><category domain="http://chriskirby.net/archive/tags/Internet/default.aspx">Internet</category><category domain="http://chriskirby.net/archive/tags/Coding/default.aspx">Coding</category><category domain="http://chriskirby.net/archive/tags/Software/default.aspx">Software</category><category domain="http://chriskirby.net/archive/tags/Wookie/default.aspx">Wookie</category></item></channel></rss>