<?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>Benjamin Guinebertière : .NET Framework 2.0 development</title><link>http://blogs.msdn.com/benjguin/archive/tags/.NET+Framework+2.0+development/default.aspx</link><description>Tags: .NET Framework 2.0 development</description><dc:language>fr-FR</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>How to HTTP POST a document to a BizTalk Receive Location</title><link>http://blogs.msdn.com/benjguin/archive/2007/08/29/how-to-http-post-a-document-to-a-biztalk-receive-location.aspx</link><pubDate>Thu, 30 Aug 2007 00:30:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4634334</guid><dc:creator>benjguin</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/benjguin/comments/4634334.aspx</comments><wfw:commentRss>http://blogs.msdn.com/benjguin/commentrss.aspx?PostID=4634334</wfw:commentRss><description>&lt;p&gt;I've been looking for this sample code on my hard drive again today.
&lt;/p&gt;&lt;p&gt;It will be easier to find it on my blog &lt;span style="font-family:Wingdings"&gt;J&lt;/span&gt;
	&lt;/p&gt;&lt;p&gt;Here it is:
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;        /// &amp;lt;summary&amp;gt;
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;        /// Sends a document via Http POST
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;        /// &amp;lt;/summary&amp;gt;
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;        /// &amp;lt;param name="url"&amp;gt;URL to send to&amp;lt;/param&amp;gt;
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;        /// &amp;lt;param name="body"&amp;gt;content to send&amp;lt;/param&amp;gt;
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;        public static string SendViaHttpPost(string url, string body)
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;        {
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;            StringBuilder response = new StringBuilder();
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;            WebResponse result = null;
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;
 &lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;            try 
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;            {
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                WebRequest req = WebRequest.Create(url);
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                req.Method = "POST";
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                req.ContentType = "text/xml; charset=utf-8";
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                req.Credentials = System.Net.CredentialCache.DefaultCredentials; // use current user credentials
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                byte[] someBytes = null;
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;
 &lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                someBytes = Encoding.UTF8.GetBytes(body);
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                req.ContentLength = someBytes.Length;
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                Stream newStream = req.GetRequestStream();
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                newStream.Write(someBytes, 0, someBytes.Length);
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                newStream.Close();
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;
 &lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                result = req.GetResponse();
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                Stream ReceiveStream = result.GetResponseStream();
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                StreamReader sr = new StreamReader( ReceiveStream, encode );
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                Char[] read = new Char[256];
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                int count = sr.Read( read, 0, 256 );
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                while (count &amp;gt; 0) 
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                {
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                    String str = new String(read, 0, count);
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                    response.Append(str);
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                    count = sr.Read(read, 0, 256);
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                }
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;            } 
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;            finally 
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;            {
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                if ( result != null ) 
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                {
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                    result.Close();
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;                }
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;            }
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;            return response.ToString();
&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;        }&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4634334" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/benjguin/archive/tags/.NET+Framework+2.0+development/default.aspx">.NET Framework 2.0 development</category><category domain="http://blogs.msdn.com/benjguin/archive/tags/BizTalk+Server+2006+R2/default.aspx">BizTalk Server 2006 R2</category></item><item><title>franglais (half French, half English) code might be OK under some circumstances</title><link>http://blogs.msdn.com/benjguin/archive/2006/09/17/759682.aspx</link><pubDate>Sun, 17 Sep 2006 23:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:759682</guid><dc:creator>benjguin</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/benjguin/comments/759682.aspx</comments><wfw:commentRss>http://blogs.msdn.com/benjguin/commentrss.aspx?PostID=759682</wfw:commentRss><description>I usually work with French companies where development happens in English because the code might be maintained, sent or whatever to other developers in the world that don't speak French.&lt;BR&gt;That's the theory. In practice, I often encounter code written in "franglais" (half English, half French). Among many bad reasons, there is one reason that seems OK for me: company's vocabulary exists only in French.&lt;BR&gt;That's why I woull recommend one rule, in such a case:&lt;BR&gt;&lt;STRONG&gt;Code must be written in English except for words in the company's glossary and only for those words&lt;/STRONG&gt;.&lt;BR&gt;&lt;BR&gt;Let me elaborate on this.&lt;BR&gt;If glossary does not exists at all, just start it and maintain it with the code.&lt;BR&gt;&lt;BR&gt;Let's take an example and imagine the glossary contains the word Canard, ...&lt;BR&gt;Code could look like&lt;BR&gt;&lt;PRE&gt;if (firstCanard.BirthDate &amp;gt; searchDate)
...
&lt;/PRE&gt;&lt;BR&gt;On the opposite, this would be bad code:&lt;BR&gt;&lt;PRE&gt;if (premierCanard.BirthDate &amp;gt; searchDate)
...
&lt;/PRE&gt;because premier (first) is not part of the glossary.&lt;BR&gt;&lt;BR&gt;
&lt;HR&gt;
Je travaille régulièrement avec des enterprises françaises où le développement est en anglais parce que le code pourrait être maintenu, envoyé ou quoique ce soit d'autre à des développeurs ailleurs dans le monde qui ne parlent pas français.&lt;BR&gt;Ca, c'est la théorie. En pratique, je rencotre souvent du code écrit en franglais. Parmi plein de mauvaises raisons, il y en a une qui me semble légitime: le vocabulaire propre à l'entreprise n'existe qu'en français.&lt;BR&gt;C'est pourquoi je recommnderais une règle, dans un tel cas:&lt;BR&gt;&lt;STRONG&gt;Le code doit être en anglais sauf pour les mots présents dans le glossaire d'entreprise et seulement pour ces mots&lt;/STRONG&gt;.&lt;BR&gt;&lt;BR&gt;Voici quelques détails supplémentaires.&lt;BR&gt;Si le glossaire n'existe pas, il suffit de l'initier et de le maintenir avec le code.&lt;BR&gt;&lt;BR&gt;Imaginons pour prendre un exemple que le glossaire contienne le mot Canard.&lt;BR&gt;Le code pourrait alors ressembler à&lt;BR&gt;&lt;PRE&gt;if (firstCanard.BirthDate &amp;gt; searchDate)
...
&lt;/PRE&gt;&lt;BR&gt;en revanche, le code suivant ne serait pas valable:&lt;BR&gt;&lt;PRE&gt;if (premierCanard.BirthDate &amp;gt; searchDate)
...
&lt;/PRE&gt;parce que "premier" ne fait pas partie du glossaire.&lt;BR&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=759682" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/benjguin/archive/tags/.NET+Framework+2.0+development/default.aspx">.NET Framework 2.0 development</category></item><item><title>define new cultures like en-FR with .NET Framework 2.0</title><link>http://blogs.msdn.com/benjguin/archive/2006/04/22/581402.aspx</link><pubDate>Sat, 22 Apr 2006 23:37:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:581402</guid><dc:creator>benjguin</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/benjguin/comments/581402.aspx</comments><wfw:commentRss>http://blogs.msdn.com/benjguin/commentrss.aspx?PostID=581402</wfw:commentRss><description>&lt;P&gt;Some global companies use English as their official language because English is the language spoken by most people at least in working environment in occidental countries. But this is not very common to obtain a response when asking what culture is the official culture. For a French global company, is it en-GB, en-US? I would say it could be en-FR, ie all vocabulary is English but metric system is used, dates are written in dd/MM/yyyy format, decimal separator is the comma (,), etc.&lt;BR&gt;It is too long to have people learning French so English is used as the default language. On the other side, it is very easy for somebody to learn formatting, metric system etc (a matter of hours to getting used to it).&lt;/P&gt;
&lt;P&gt;So en-FR could be used for our French Global company, but en-FR culture does not exist in .NET Framework. The good news is that it can be defined.&lt;/P&gt;
&lt;P&gt;Here is a sample code that installs en-FR culture&lt;/P&gt;&lt;PRE&gt;using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
…
static void Main(string[] args)
{
	try
	{
		CultureAndRegionInfoBuilder.Unregister("en-FR");
	}
	catch (Exception ex)
	{
		Console.WriteLine("could not unregister en-FR culture: {0}", ex);
	}

	CultureInfo templateCulture = new CultureInfo("fr-FR");
	CultureAndRegionInfoBuilder cib = 
		new CultureAndRegionInfoBuilder("en-FR",
			CultureAndRegionModifiers.None);
	cib.LoadDataFromCultureInfo(new CultureInfo("en", false));
	cib.LoadDataFromRegionInfo(new RegionInfo("FR"));
	cib.NumberFormat = templateCulture.NumberFormat;
	cib.GregorianDateTimeFormat = templateCulture.DateTimeFormat;
	cib.Register();

	Console.WriteLine("OK");
	Console.ReadLine();
}
&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=581402" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/benjguin/archive/tags/.NET+Framework+2.0+development/default.aspx">.NET Framework 2.0 development</category></item><item><title>debug .NET Assembly loading</title><link>http://blogs.msdn.com/benjguin/archive/2006/04/07/570902.aspx</link><pubDate>Fri, 07 Apr 2006 19:17:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:570902</guid><dc:creator>benjguin</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/benjguin/comments/570902.aspx</comments><wfw:commentRss>http://blogs.msdn.com/benjguin/commentrss.aspx?PostID=570902</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Create a text file named fusionLog.reg&lt;BR&gt;Edit it with notepad and add the following content:&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV&gt;&lt;FONT face=Verdana color=#000000 size=2&gt;Windows Registry Editor Version 5.00&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Verdana color=#000000 size=2&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]&lt;BR&gt;"ZapQuotaInKB"=dword:000f4240&lt;BR&gt;"ViewerAttributes"=dword:50b00149&lt;BR&gt;"LogFailures"=dword:00000001&lt;BR&gt;"LogPath"="c:\\log\\Fusion"&lt;BR&gt;"ForceLog"=dword:00000000&lt;BR&gt;"LogResourceBind"=dword:00000001&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;create a folder c:\log\fusion&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;double click the fusionLog.reg file and accept adding info in the registry&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;Each time an assembly fails to load, a log file is created in c:\log\fusion folder&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT face=Verdana size=2&gt;In order to also see successes, change ForceLog to 1&lt;/FONT&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=570902" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/benjguin/archive/tags/.NET+Framework+2.0+development/default.aspx">.NET Framework 2.0 development</category></item><item><title>Session State was not kept in a web farm</title><link>http://blogs.msdn.com/benjguin/archive/2006/04/04/568437.aspx</link><pubDate>Tue, 04 Apr 2006 21:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:568437</guid><dc:creator>benjguin</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/benjguin/comments/568437.aspx</comments><wfw:commentRss>http://blogs.msdn.com/benjguin/commentrss.aspx?PostID=568437</wfw:commentRss><description>One of the ways to replicate content from a Web Server in an IIS 6 Web Farm to other servers in the farm is to use IISMT tool.&lt;BR&gt;&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=2aefc3e4-ce97-4f25-ace6-127f933a6cd2&amp;amp;displaylang=en"&gt;IISMT&lt;/A&gt; is a migration tool but it can also be used to "migrate" copy content and metabase configuration from IIS 6 to another IIS 6 server.&lt;BR&gt;&lt;BR&gt;On a platform where this method was used (with ASP.NET 2.0), we encountered an issue: session was not kept while machineKey section in config file was well configured. The issue appeared with State Server as well as SQL Server.&lt;BR&gt;&lt;BR&gt;In order to check that did not come from application, we reproed the problem by adding the two following files in ASP.NET application folder:&lt;BR&gt;DebugSession.aspx which contains:&lt;BR&gt;&lt;FONT face="Arial Narrow"&gt;&lt;PRE&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true"  CodeFile="DebugSession.aspx.cs" Inherits="_DebugSession" %&amp;gt;

&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;

&amp;lt;html xmlns="http://www.w3.org/1999/xhtml" &amp;gt;
&amp;lt;head runat="server"&amp;gt;
    &amp;lt;title&amp;gt;Session&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;form id="form1" runat="server"&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;nbsp;&amp;lt;/div&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/PRE&gt;&lt;/FONT&gt;&lt;BR&gt;and DebugSession.aspx.cs which contains:&lt;BR&gt;&lt;FONT face="Arial Narrow"&gt;&lt;PRE&gt;using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _DebugSession : System.Web.UI.Page 
{

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["now"] == null) Session["now"] = string.Empty;
        Session["before"] = Session["now"];
        Session["now"] = Guid.NewGuid().ToString();

        Response.Write("&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Key&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Value&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;");
        Response.Write(string.Format("&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Session ID&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{0}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;", Session.SessionID));

        foreach (string key in Session.Keys)
            Response.Write(string.Format("&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;{0}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{1}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;", key, Session[key]));
        
        Response.Write("&amp;lt;/table&amp;gt;");
    }
}
&lt;/PRE&gt;&lt;/FONT&gt;&lt;BR&gt;Calling this DebugSession.aspx and refreshing it showed that session variables were definetly different on both servers (there were 2 in the farm).&lt;BR&gt;&lt;BR&gt;By investigating further we found the issue came from the site having a different ID on the two servers.&lt;BR&gt;One was at /LM/W3SVC/1, the other one was /LM/W3SVC/2 because that's the way IISMT copies configuration by default, except when you add the following command arguments: "/siteID replace"&lt;BR&gt;So we deleted the Web Site on the second server and recreated it with the IISMT command line ended by /siteID replace&lt;BR&gt;&lt;BR&gt;Please check IISMT /? for further details.&lt;BR&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=568437" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/benjguin/archive/tags/.NET+Framework+2.0+development/default.aspx">.NET Framework 2.0 development</category><category domain="http://blogs.msdn.com/benjguin/archive/tags/Web+Infrastructure/default.aspx">Web Infrastructure</category></item><item><title>Binding an ASP.NET 2.0 GridView to a DataSet stored in session</title><link>http://blogs.msdn.com/benjguin/archive/2005/07/30/445484.aspx</link><pubDate>Sat, 30 Jul 2005 23:40:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:445484</guid><dc:creator>benjguin</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/benjguin/comments/445484.aspx</comments><wfw:commentRss>http://blogs.msdn.com/benjguin/commentrss.aspx?PostID=445484</wfw:commentRss><description>&lt;P&gt;I just want to share some experience about binding the ASP.NET 2.0 GridView (DataGrid successor) to a DataSet without using the DataAdapter like feature of the datasource.&lt;/P&gt;
&lt;P&gt;There are two ways to bind the GridView: DataSourceID (basically used at design time) that binds to a dataSource control or DataSource (basically used at runtime). I was in a case where the DataSet was stored in session. The code uses adapters to fill it and update it, but I did not want the gridview datasource to do it (update could occur after several screens interactions).&lt;/P&gt;
&lt;P&gt;I first tried the DataSource approach and it seems that it is the wrong way to go: The GridVoew could show the DataSet, but trying to update it quickly became a nightmare with more and more useless code :-(&lt;/P&gt;
&lt;P&gt;Then I used the DataSourceID. It points to an objectDataSource and I created such an object. Here is how it looks: &lt;/P&gt;
&lt;P&gt;The page has a GridView with a DataSourceID pointing to an ObjectDataSource control pointing to a small class which handles the events&lt;/P&gt;&lt;PRE&gt;&lt;FONT face="Arial Narrow" size="3"&gt;&amp;lt;%@ Page Language="C#" MasterPageFile="~/Main.master" 
	AutoEventWireup="true" CodeFile="TwoGridUI.aspx.cs" 
	Inherits="TwoGridUI" Title="Untitled Page" %&amp;gt;&lt;BR&gt;&amp;lt;asp:Content ID="Content1" 
	ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:GridView ID="GridView1" runat="server" 
	CellPadding="4" ForeColor="#333333" GridLines="None" 
	AutoGenerateColumns="False" AutoGenerateDeleteButton="True" 
	AutoGenerateEditButton="True" DataKeyNames="inv_ID" 
	DataSourceID="RuntimeObjectDataSource"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowStyle BackColor="#F7F6F3" ForeColor="#333333" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;EditRowStyle BackColor="#999999" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;AlternatingRowStyle BackColor="White" ForeColor="#284775" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Columns&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundField DataField="inv_ID" HeaderText="ID" ReadOnly="True" SortExpression="inv_ID" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundField DataField="inv_CreationDate" HeaderText="CreationDate" ReadOnly="True"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SortExpression="inv_CreationDate" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundField DataField="inv_TotalAmount" 
			HeaderText="inv_TotalAmount" SortExpression="TotalAmount" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Columns&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:GridView&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;nbsp;&amp;lt;asp:ObjectDataSource ID="RuntimeObjectDataSource" runat="server" DeleteMethod="Delete"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InsertMethod="Insert" SelectMethod="Select" TypeName="InvoiceDataSource"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UpdateMethod="Update"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:ObjectDataSource&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br /&amp;gt;&lt;BR&gt;&amp;lt;/asp:Content&amp;gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;Here is the class the object DataSource uses&lt;/P&gt;&lt;PRE&gt;&lt;FONT face="Arial Narrow" size="3"&gt;using System;
using System.Data;
using System.Configuration;
using System.Diagnostics;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using Contoso.Architecture;
using Contoso.SampleApplication.BusinessEntity;

/// &lt;SUMMARY&gt;
/// Summary description for InvoiceDataSource
/// &lt;/SUMMARY&gt;
public class InvoiceDataSource
{
	private DataSetArtifacts.inv_InvoiceDataTable InvoiceTable
	{
		get
		{
			return (DataSetArtifacts.inv_InvoiceDataTable)
				ContosoContext.Current.DataContexts["invoice"].DataSet.Tables["inv_Invoice"];
		}
	}

	public DataSetArtifacts.inv_InvoiceDataTable Select()
	{
		return InvoiceTable;
	}

	public void Update(double inv_TotalAmount, int original_inv_ID)
	{
		DataSetArtifacts.inv_InvoiceRow row = InvoiceTable.FindByinv_ID(original_inv_ID);
		row["inv_TotalAmount"] = inv_TotalAmount;
	}

	public void Delete(int original_inv_ID)
	{
		DataSetArtifacts.inv_InvoiceRow row = InvoiceTable.FindByinv_ID(original_inv_ID);
		row.Delete();
		Debug.WriteLine(row.RowState);
	}

	public void Insert(int inv_Id, DateTime inv_CreationDateTime, double inv_TotalAmount)
	{
		System.Diagnostics.Debug.WriteLine(string.Format(
			"{0} {1} {2}", inv_Id, inv_CreationDateTime, inv_TotalAmount));
	}
}&lt;/FONT&gt;

&lt;/PRE&gt;
&lt;P&gt;The beauty of this is the code behind: &lt;/P&gt;&lt;PRE&gt;&lt;FONT face="Arial Narrow" size="3"&gt;using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Diagnostics;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;


public partial class TwoGridUI : SampleApplicationPageController
{
	protected void Page_Load(object sender, EventArgs e)
	{
		MaintainScrollPositionOnPostBack = true;
	}
}&lt;/FONT&gt;
&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=445484" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/benjguin/archive/tags/.NET+Framework+2.0+development/default.aspx">.NET Framework 2.0 development</category></item><item><title>SQL Server 2005: Migrate cursor developed stored procedures</title><link>http://blogs.msdn.com/benjguin/archive/2005/05/10/416110.aspx</link><pubDate>Tue, 10 May 2005 16:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:416110</guid><dc:creator>benjguin</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/benjguin/comments/416110.aspx</comments><wfw:commentRss>http://blogs.msdn.com/benjguin/commentrss.aspx?PostID=416110</wfw:commentRss><description>&lt;P&gt;In a recent mission, customer had many stored procedures using cursors. Those stored procedures contained business code and it was very important to avoid regressions. So I wondered how Visual Basic .NET stored procedures that could keep business logic would behave compared to pure SQL Statements and cursors.&lt;/P&gt;
&lt;P&gt;Here are the results of my tests:&lt;/P&gt;
&lt;P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&lt;STRONG&gt;&lt;U&gt;Stored procedure style&lt;/U&gt;		&lt;U&gt;Execution time&lt;/U&gt;&lt;/STRONG&gt;

Transact-SQL cursors		1 minute

Visual Basic .NET,
same logic as cursors		7 s

Transact-SQL, SQL style		&amp;lt; 1 s&lt;/FONT&gt; 
&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;I was not surprised to see that SQL style was the fastest, but I also liked the result on VB .NET :-)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is the simple code I used&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Create a table&lt;/STRONG&gt; with 1000 rows. By self joining it, I will get a billion rows.&lt;/P&gt;&lt;PRE&gt;&lt;FONT size=3&gt;use misc&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;drop table tableA&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;create table tableA&lt;BR&gt;(&lt;BR&gt;&amp;nbsp;ID int primary key&lt;BR&gt;)&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;declare @i int;&lt;BR&gt;SET @i=1;&lt;BR&gt;WHILE @i &amp;lt;= 1000&lt;BR&gt;BEGIN&lt;BR&gt;&amp;nbsp;insert into tableA values(@i);&lt;BR&gt;&amp;nbsp;SET @i=@i+1;&lt;BR&gt;END&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;select count(*) from tableA&lt;BR&gt;go&lt;BR&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;VB .NET stored procedure code:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;&lt;FONT size=3&gt;Imports System&lt;BR&gt;Imports System.Data&lt;BR&gt;Imports System.Data.Sql&lt;BR&gt;Imports System.Data.SqlClient&lt;BR&gt;Imports System.Data.SqlTypes&lt;BR&gt;Imports Microsoft.SqlServer.Server&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;BR&gt;&lt;FONT size=3&gt;Partial Public Class StoredProcedures&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Microsoft.SqlServer.Server.SqlProcedure()&amp;gt; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Shared Sub VBCursor()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim total As SqlTypes.SqlDecimal&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total = 0&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Using cn As New SqlConnection("context connection=true")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim cmd As New SqlCommand( _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "select cast(a.ID * b.ID as decimal) from tableA a, tableA b", _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cn)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cn.Open()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim reader As SqlDataReader&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader = cmd.ExecuteReader()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; While reader.Read()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total = total + reader.GetDecimal(0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End While&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader.Close()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cn.Close()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Using&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim resultRecord As New _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT size=3&gt;SqlDataRecord(New SqlMetaData("result", SqlDbType.Decimal))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultRecord.SetDecimal(0, total.Value)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlContext.Pipe.Send(resultRecord)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;BR&gt;End Class&lt;BR&gt;&lt;/PRE&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;STRONG&gt;Transact-SQL stored procedures code&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;&lt;FONT size=3&gt;drop procedure TSQLSet&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;create procedure TSQLSet&lt;BR&gt;as&lt;BR&gt;&amp;nbsp;select sum(cast(a.ID * b.ID as decimal))&lt;BR&gt;&amp;nbsp;from tableA a, tableA b&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;drop procedure TSQLCursor;&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;BR&gt;&lt;FONT size=3&gt;create procedure TSQLCursor&lt;BR&gt;as&lt;BR&gt;&amp;nbsp;declare @current decimal;&lt;BR&gt;&amp;nbsp;declare @total decimal;&lt;BR&gt;&amp;nbsp;set @total=0;&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&amp;nbsp;declare c cursor for &lt;BR&gt;&amp;nbsp;select cast(a.ID * b.ID as decimal)&lt;BR&gt;&amp;nbsp;from tableA a, tableA b;&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&amp;nbsp;open c;&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&amp;nbsp;fetch next from c into @current;&lt;BR&gt;&amp;nbsp;while @@fetch_status=0&lt;BR&gt;&amp;nbsp;begin&lt;BR&gt;&amp;nbsp;&amp;nbsp;set @total = @total + @current;&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&amp;nbsp;&amp;nbsp;fetch next from c into @current;&lt;BR&gt;&amp;nbsp;end&lt;BR&gt;&amp;nbsp;close c;&lt;BR&gt;&amp;nbsp;deallocate c;&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&amp;nbsp;select @total;&lt;BR&gt;go&lt;BR&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;Test execution code&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;&lt;FONT size=3&gt;exec TSQLSet&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;exec TSQLCursor&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;exec VBCursor&lt;BR&gt;go&lt;BR&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=416110" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/benjguin/archive/tags/.NET+Framework+2.0+development/default.aspx">.NET Framework 2.0 development</category><category domain="http://blogs.msdn.com/benjguin/archive/tags/SQL+Server+2005/default.aspx">SQL Server 2005</category></item><item><title>Unifying XML namespaces and .NET namespaces</title><link>http://blogs.msdn.com/benjguin/archive/2005/04/21/410382.aspx</link><pubDate>Thu, 21 Apr 2005 08:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:410382</guid><dc:creator>benjguin</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/benjguin/comments/410382.aspx</comments><wfw:commentRss>http://blogs.msdn.com/benjguin/commentrss.aspx?PostID=410382</wfw:commentRss><description>&lt;P&gt;I just want to share how I usually create XML Namespaces.&lt;/P&gt;
&lt;P&gt;Let's say&amp;nbsp;I work for a contoso company which has a site at http://www.contoso.com and I'm defining an XML schema in a BizTalk Server 2004. BizTalk Server 2004 will create a .NET Class out of this XSD schema that would live inside my BizTalk Server 2004 project (of course, this can be used in many other cases that just BizTalk Server 2004).&lt;BR&gt;This project could have a namespace of Contoso.Eai.SomeProject then I would use the following XML Namespace for the schema:&lt;/P&gt;
&lt;P&gt;urn:www-contoso-com:Contoso.Eai.SomeProject.MySchema&lt;/P&gt;
&lt;P&gt;URN syntax is defined at &lt;A href="http://www.apps.ietf.org/rfc/rfc2141.html"&gt;http://www.apps.ietf.org/rfc/rfc2141.html&lt;/A&gt;. Here are some interesting excerpts:&lt;/P&gt;
&lt;P&gt;&amp;lt;URN&amp;gt; ::= "urn:" &amp;lt;NID&amp;gt; ":" &amp;lt;NSS&amp;gt;&lt;BR&gt;where &amp;lt;NID&amp;gt; is the Namespace Identifier, and &amp;lt;NSS&amp;gt; is the Namespace Specific String&lt;/P&gt;
&lt;P&gt;The idea is that NID designs who can understand NSS. As NID can only have letters, numbers and -, I use this type of equivalence:&lt;/P&gt;
&lt;P&gt;www-contoso-com for www.contoso.com&lt;BR&gt;someone-at-contoso-com for someone@contoso.com.&lt;FONT color=#000000&gt; ex.: urn:someone-at-contoso-com:SomeoneCanUnderstandThisPart&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Also note that NID&amp;nbsp;is 1 to 31 only character long.&lt;/P&gt;
&lt;P&gt;In theory, the NID should be registered, but for a custom development, this type of URN notation can be sufficient. We could consider I use what is described at &lt;A href="http://www.w3.org/TR/uri-clarification/#private-unregistered-uri-schemes"&gt;http://www.w3.org/TR/uri-clarification/#private-unregistered-uri-schemes&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;I found this way of defining XML namespaces easier than the http://www.contoso.com/Whatever that introduces some confusion between the namespace (which is just ment to be an identifier) and a URL (which is a location).&lt;/P&gt;
&lt;P&gt;:-)&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=410382" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/benjguin/archive/tags/BizTalk+Server+2006/default.aspx">BizTalk Server 2006</category><category domain="http://blogs.msdn.com/benjguin/archive/tags/.NET+Framework+2.0+development/default.aspx">.NET Framework 2.0 development</category><category domain="http://blogs.msdn.com/benjguin/archive/tags/BizTalk+Server+2004/default.aspx">BizTalk Server 2004</category></item></channel></rss>