<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Lasse Eskildsen</title>
    <description>on uCommerce, Commerce Server and everything .net related</description>
    <link>http://blog.lasseeskildsen.net/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.5.0.7</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://blog.lasseeskildsen.net/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Lasse Eskildsen</dc:creator>
    <dc:title>Lasse Eskildsen</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/lasseeskildsen/cWRY" /><feedburner:info uri="lasseeskildsen/cwry" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Assembly redirect not working?</title>
      <description>&lt;p&gt;I spent the evening troubleshooting an issue, where we needed redirect some assemblies from one version to another – something that might happen to you, if you use Fluent NHibernate and the Castle Project in the same assembly.&lt;/p&gt;  &lt;p&gt;The project had a reference to Castle.Core.dll version 2.2.0.0, but Fluent NHibernate requires version 2.1.0.0 of the same file. We set up the redirect in web.config, but still got an exception at runtime, telling us that we needed version 2.1.0.0 of the file. &lt;/p&gt;  &lt;p&gt;The cause: We had forgotten the ever so important namespace for the assemblyBinding element in web.config! &lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;runtime&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;assemblyBinding&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;urn:schemas-microsoft-com:asm.v1&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;dependentAssembly&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;assemblyIdentity&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Castle.Core&amp;quot;&lt;/span&gt; 
                        &lt;span class="attr"&gt;publicKeyToken&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;407dd0808d44fbdc&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;assemblyIdentity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;bindingRedirect&lt;/span&gt;  &lt;span class="attr"&gt;oldVersion&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.1.0.0&amp;quot;&lt;/span&gt; 
                        &lt;span class="attr"&gt;newVersion&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.2.0.0&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;bindingRedirect&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;dependentAssembly&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;dependentAssembly&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;assemblyIdentity&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Castle.DynamicProxy2&amp;quot;&lt;/span&gt; 
                        &lt;span class="attr"&gt;publicKeyToken&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;407dd0808d44fbdc&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;assemblyIdentity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;bindingRedirect&lt;/span&gt;  &lt;span class="attr"&gt;oldVersion&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2.1.0.0&amp;quot;&lt;/span&gt; 
                        &lt;span class="attr"&gt;newVersion&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;2.2.0.0&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;bindingRedirect&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;dependentAssembly&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;assemblyBinding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;runtime&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
Do’h.&lt;img src="http://feeds.feedburner.com/~r/lasseeskildsen/cWRY/~4/YsONS16Iivg" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/lasseeskildsen/cWRY/~3/YsONS16Iivg/post.aspx</link>
      <author>leskil</author>
      <comments>http://blog.lasseeskildsen.net/post/Assembly-redirect-not-working.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lasseeskildsen.net/post.aspx?id=c8b9e0cb-4c1b-4d37-976d-7516c7d4a2d4</guid>
      <pubDate>Wed, 22 Dec 2010 06:27:37 +1100</pubDate>
      <category>.NET</category>
      <category>ASP.NET</category>
      <dc:publisher>leskil</dc:publisher>
      <pingback:server>http://blog.lasseeskildsen.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.lasseeskildsen.net/post.aspx?id=c8b9e0cb-4c1b-4d37-976d-7516c7d4a2d4</pingback:target>
      <slash:comments>48</slash:comments>
      <trackback:ping>http://blog.lasseeskildsen.net/trackback.axd?id=c8b9e0cb-4c1b-4d37-976d-7516c7d4a2d4</trackback:ping>
      <wfw:comment>http://blog.lasseeskildsen.net/post/Assembly-redirect-not-working.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lasseeskildsen.net/syndication.axd?post=c8b9e0cb-4c1b-4d37-976d-7516c7d4a2d4</wfw:commentRss>
    <feedburner:origLink>http://blog.lasseeskildsen.net/post.aspx?id=c8b9e0cb-4c1b-4d37-976d-7516c7d4a2d4</feedburner:origLink></item>
    <item>
      <title>A sneak peak on exporting orders from uCommerce</title>
      <description>&lt;p&gt;For the last couple of weeks, I have been working on the newest addition to uCommerce, called uCommerce Connector. &lt;/p&gt;  &lt;p&gt;The purpose of the Connector is to, well, connect uCommerce to your backend systems, like your ERP system, inventory management, order fulfilment and so on. The connection goes both ways. For example, you might want to import products into uCommerce, and export orders back into your ERP system.&lt;/p&gt;  &lt;p&gt;This blog post is an example on how to manually export orders from within uCommerce. Please note that the Connector is not yet released, and the API’s are subject to change.&lt;/p&gt;  &lt;h3&gt;The basics of uCommerce Connector&lt;/h3&gt;  &lt;p&gt;The Connector is able to handle all imports and exports to and from uCommerce. All entites can be used – even your own.&lt;/p&gt;  &lt;p&gt;Each import or export are created using a &lt;em&gt;workflow&lt;/em&gt;, which is a series of steps, defined in an XML file. Each step can be either a source, a transformation or a destination. These steps can be easily implemented using your favorite .NET language. A workflow can be hosted either in the site, or in a Windows service, ie. for automatically exporting orders whenever they are recieved or changed to a certain status.&lt;/p&gt;  &lt;h3&gt;An example: Exporting orders&lt;/h3&gt;    &lt;p&gt;The purpose of this example is to show how the default orders export is implemented. This will be a default feature in uCommerce, once released. &lt;/p&gt;  &lt;p&gt;I have added a new export action for a single order. &lt;a href="http://blog.lasseeskildsen.net/image.axd?picture=ExportOrder.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="ExportOrder" border="0" alt="ExportOrder" src="http://blog.lasseeskildsen.net/image.axd?picture=ExportOrder_thumb.png" width="240" height="166" /&gt;&lt;/a&gt;When exporting an order, the user should be able to select a format, and then download the order from a dialog.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.lasseeskildsen.net/image.axd?picture=ExportOrderDialog.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="ExportOrderDialog" border="0" alt="ExportOrderDialog" src="http://blog.lasseeskildsen.net/image.axd?picture=ExportOrderDialog_thumb.png" width="299" height="96" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Step 0: Interfaces and the XML file&lt;/h3&gt;  &lt;p&gt;Each workflow is contained in an XML file, listed below (click to enlarge). This XML file contains the steps created in remainder of this post.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.lasseeskildsen.net/image.axd?picture=image_7.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.lasseeskildsen.net/image.axd?picture=image_thumb_7.png" width="444" height="233" /&gt;&lt;/a&gt;&lt;/p&gt;      &lt;p&gt;The components section contains the components for the workflow, and the workflow section contains the order in which the components will be executed. Note that there will be more steps available in a later version, such as a conditional step, and a much nicer UI for editing workflows, so you don’t have to mess around with the XML. But now you know it’s there.&lt;/p&gt;  &lt;p&gt;The component for the first step must be a source, by implementing the IConnectorSource&amp;lt;T&amp;gt; interface:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IConnectorSource&amp;lt;T&amp;gt; : IConnectorSource
{
    T Get();
}&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;And the last step must be a destination, by implementing the IConnectorDestination&amp;lt;T&amp;gt; interface:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IConnectorDestination&amp;lt;T&amp;gt; : IConnectorDestination
{
    &lt;span class="kwrd"&gt;void&lt;/span&gt; Persist(T &lt;span class="kwrd"&gt;value&lt;/span&gt;);
}&lt;/pre&gt;

&lt;p&gt;It is important to note, that the output of each step, must match the input of the next step. That’s why you can add transformations in between the source and the destination.&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;p&gt;Transformations must implement the ITransformation&amp;lt;TFrom, TTo&amp;gt; interface (more types will be added):&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; ITransformation&amp;lt;TFrom, TTo&amp;gt; : ITransformation
{
    TTo Transform(TFrom from);
}&lt;/pre&gt;

&lt;h3&gt;Step 1: Getting the currently selected order&lt;/h3&gt;

&lt;p&gt;The ID for the current order can be found in the query string for the dialog, and since we have access to the current HTTP context from within our workflow, we can grab the value from here and return the order from the database, using the sample code below:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; BackEndSelectedPurchaseOrderSource : IConnectorSource&amp;lt;PurchaseOrder&amp;gt;
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; PurchaseOrder Get()
    {
        var orderIdString = HttpContext.Current.Request.QueryString[&lt;span class="str"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;]
            .Replace(&lt;span class="str"&gt;&amp;quot;Order_&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty);
        var orderId = &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(orderIdString);

        &lt;span class="kwrd"&gt;return&lt;/span&gt; PurchaseOrder.SingleOrDefault(x =&amp;gt; x.OrderId == orderId);
    }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;h3&gt;Step 2: Transforming the order to XML&lt;/h3&gt;

&lt;p&gt;Next up, we would like to transform the order into XML, so the user can download it, and import it elsewhere. Since uCommerce already supports rendering all entities as XML, to be used via the XSLT API, we can just reuse these renderes:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; PurchaseOrderToXmlDocumentTransformation 
    : ITransformation&amp;lt;PurchaseOrder, XmlDocument&amp;gt;
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; XmlDocument Transform(PurchaseOrder from)
    {
        var renderer = CreateRenderer();
        &lt;span class="kwrd"&gt;return&lt;/span&gt; renderer.RenderDocument(from);
    }

    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; PurchaseOrderRenderer CreateRenderer()
    {
        return PurchaseOrderRenderer.Create();&lt;br /&gt;    }
}&lt;/pre&gt;

&lt;h3&gt;Step 3: Downloading the file&lt;/h3&gt;

&lt;p&gt;Last but not least, we put the XML in a stream and send it to the user, which will open the browser’s standard file download dialog box:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; PurchaseOrderDownloadStreamDestination 
    : IConnectorDestination&amp;lt;XmlDocument&amp;gt;
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Persist(XmlDocument &lt;span class="kwrd"&gt;value&lt;/span&gt;)
    {
        var stream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream();
        var streamWriter = &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamWriter(stream) { AutoFlush = &lt;span class="kwrd"&gt;true&lt;/span&gt; };

        streamWriter.Write(&lt;span class="kwrd"&gt;value&lt;/span&gt;.InnerXml);
        stream.Position = 0;

        Download(stream, Guid.NewGuid() + &lt;span class="str"&gt;&amp;quot;.xml&amp;quot;&lt;/span&gt;);
    }

    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Download(Stream stream, &lt;span class="kwrd"&gt;string&lt;/span&gt; fileName)
    {
        var response = HttpContext.Current.Response;

        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[(&lt;span class="kwrd"&gt;int&lt;/span&gt;)stream.Length];
        stream.Read(buffer, 0, (&lt;span class="kwrd"&gt;int&lt;/span&gt;)stream.Length);

        response.Clear();
        response.AddHeader(&lt;span class="str"&gt;&amp;quot;Content-Disposition&amp;quot;&lt;/span&gt;, 
            &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;attachment; filename={0}&amp;quot;&lt;/span&gt;, fileName));
        response.AddHeader(&lt;span class="str"&gt;&amp;quot;Content-Length&amp;quot;&lt;/span&gt;, stream.Length.ToString());
        response.ContentType = &lt;span class="str"&gt;&amp;quot;application/octet-stream&amp;quot;&lt;/span&gt;;
        response.BinaryWrite(buffer);
        response.End();
    }
}&lt;/pre&gt;

&lt;h3&gt;Step 4: Registering the new workflow&lt;/h3&gt;

&lt;p&gt;The workflow created above can be added to the web site’s web.config, in the &lt;em&gt;Commerce &lt;/em&gt;section, and will now be accesible from the export dialog:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;integration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;workflows&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;XmlDownload&amp;quot;&lt;/span&gt; 
          &lt;span class="attr"&gt;filePath&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;~/umbraco/ucommerce/integrations/exportcurrentorder.xml&amp;quot;&lt;/span&gt; 
          &lt;span class="attr"&gt;displayName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;XML download&amp;quot;&lt;/span&gt; 
          &lt;span class="attr"&gt;supportedEntity&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;PurchaseOrder&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;workflows&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;integration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;h3&gt;Other usages&lt;/h3&gt;

&lt;p&gt;The example above is a pretty simple one. In other scenarios, you could replace the download destination with a web service destination, to put the order directly into an ERP system. It is important to remember, that the Connector and the workflows are all about customizing and adjusting uCommerce to your clients individual needs.&lt;a href="http://blog.lasseeskildsen.net/image.axd?picture=sam.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="sam" border="0" alt="sam" align="right" src="http://blog.lasseeskildsen.net/image.axd?picture=sam_thumb.png" width="192" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Your feedback is greatly appreciated!&lt;/h3&gt;

&lt;p&gt;As mentioned earlier, the Connector is still under development, so if you have any feature requests, questions, ideas or anything else, please let us know, so that we can make sure that you can benefit from the Connector.&lt;/p&gt;

&lt;p&gt;Until next time…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/lasseeskildsen/cWRY/~4/nS4kUuEQDfc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/lasseeskildsen/cWRY/~3/nS4kUuEQDfc/post.aspx</link>
      <author>leskil</author>
      <comments>http://blog.lasseeskildsen.net/post/A-sneak-peak-on-exporting-orders-from-uCommerce.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lasseeskildsen.net/post.aspx?id=492e2e11-48d4-4b8b-9981-fdb4bd27707d</guid>
      <pubDate>Wed, 15 Dec 2010 10:12:20 +1100</pubDate>
      <category>.NET</category>
      <category>ASP.NET</category>
      <category>uCommerce</category>
      <dc:publisher>leskil</dc:publisher>
      <pingback:server>http://blog.lasseeskildsen.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.lasseeskildsen.net/post.aspx?id=492e2e11-48d4-4b8b-9981-fdb4bd27707d</pingback:target>
      <slash:comments>82</slash:comments>
      <trackback:ping>http://blog.lasseeskildsen.net/trackback.axd?id=492e2e11-48d4-4b8b-9981-fdb4bd27707d</trackback:ping>
      <wfw:comment>http://blog.lasseeskildsen.net/post/A-sneak-peak-on-exporting-orders-from-uCommerce.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lasseeskildsen.net/syndication.axd?post=492e2e11-48d4-4b8b-9981-fdb4bd27707d</wfw:commentRss>
    <feedburner:origLink>http://blog.lasseeskildsen.net/post.aspx?id=492e2e11-48d4-4b8b-9981-fdb4bd27707d</feedburner:origLink></item>
    <item>
      <title>uCommerce How To: Create A Product Using The API</title>
      <description>&lt;p&gt;If you want to create a product using the API, here’s how.&lt;/p&gt;  &lt;p&gt;The class diagram for products looks like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.lasseeskildsen.net/image.axd?picture=Product.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Product" border="0" alt="Product" src="http://blog.lasseeskildsen.net/image.axd?picture=Product_thumb.png" width="596" height="176" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This might seem a bit verbose, but it’s all in favor of the flexible pricing and localization of products.&lt;/p&gt;  &lt;p&gt;The data access is based on Active Record. If you haven’t already heart of that, check out the &lt;a href="http://en.wikipedia.org/wiki/Active_record_pattern"&gt;description on Wikipedia&lt;/a&gt; before reading any further.&lt;/p&gt;  &lt;p&gt;Because localized descriptions, category placement and pricing information references the concrete product, we need to create the product itself first. &lt;/p&gt;  &lt;p&gt;Before that, a short note on how to query the database for entites. If you want to find a specific entity, you can use the static SingleOrDefault&amp;lt;T&amp;gt;(Func&amp;lt;T, bool&amp;gt;) method. This will work for all entities:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;var product = Product.SingleOrDefault(x =&amp;gt; x.ProductId == 42);&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;If you want a collection of entities, use the Find&amp;lt;T&amp;gt;(Func&amp;lt;T, bool&amp;gt;) method. For example, to find all products modified within the last week:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;var products = Product.Find(x =&amp;gt; x.ModifiedOn &amp;gt;= DateTime.Now.AddDays(-7));&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;You can also use more advanced Linq queries. Getting products modified within the last week can be retrieved like this:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;var products = from p &lt;span class="kwrd"&gt;in&lt;/span&gt; Product.All()
               &lt;span class="kwrd"&gt;where&lt;/span&gt; p.ModifiedOn &amp;gt;= DateTime.Now.AddDays(-7)
               select p;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;You can also do joins and so on.&lt;/p&gt;

&lt;h3&gt;The Product&lt;/h3&gt;

&lt;p&gt;The create the product, simply create a new instance of the UCommerce.Entites.Product class, set the properties, and finally call the save method.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;var product = &lt;span class="kwrd"&gt;new&lt;/span&gt; Product
                  {
                      Sku = &lt;span class="str"&gt;&amp;quot;SKU-123456&amp;quot;&lt;/span&gt;,
                      Name = &lt;span class="str"&gt;&amp;quot;My Product&amp;quot;&lt;/span&gt;,
                      AllowOrdering = &lt;span class="kwrd"&gt;true&lt;/span&gt;,
                      DisplayOnSite = &lt;span class="kwrd"&gt;true&lt;/span&gt;,
                      ProductDefinitionId = 1,  &lt;span class="rem"&gt;// Set to an existing defintion&lt;/span&gt;
                      ThumbnailImageMediaId = 1 &lt;span class="rem"&gt;// ID from Umbraco (nullable int)&lt;/span&gt;
                  };
product.Save();&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;After calling the save method, the ProductId property will return the ID of the new product. &lt;/p&gt;

&lt;h3&gt;Localized Product Description&lt;/h3&gt;

&lt;p&gt;To add a localized description for the product, create a new instance of the UCommerce.Entities.ProductDescription class.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;var description = &lt;span class="kwrd"&gt;new&lt;/span&gt; ProductDescription
                      {
                          ProductId = product.ProductId,
                          CultureCode = &lt;span class="str"&gt;&amp;quot;en-US&amp;quot;&lt;/span&gt;, &lt;span class="rem"&gt;// or en-GB, da-DK etc.&lt;/span&gt;
                          DisplayName = &lt;span class="str"&gt;&amp;quot;My display name&amp;quot;&lt;/span&gt;,
                          ShortDescription = &lt;span class="str"&gt;&amp;quot;My short description&amp;quot;&lt;/span&gt;,
                          LongDescription = &lt;span class="str"&gt;&amp;quot;My long description&amp;quot;&lt;/span&gt;
                      };
description.Save();&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;Like with the product, the ProductDescriptionId will return the new ID of the description after calling the save method.&lt;/p&gt;

&lt;h3&gt;Pricing Information&lt;/h3&gt;

&lt;p&gt;The save a price for a product, you find the ID of the price group you want the price to belong to. After that, you can create a new price using the PriceGroupPrice class (yes, I know).&lt;/p&gt;

&lt;pre class="csharpcode"&gt;var priceGroup = PriceGroup.SingleOrDefault(x =&amp;gt; x.Name == &lt;span class="str"&gt;&amp;quot;DKK&amp;quot;&lt;/span&gt;);
var productPrice = &lt;span class="kwrd"&gt;new&lt;/span&gt; PriceGroupPrice
                       {
                           ProductId = product.ProductId,
                           PriceGroupId = priceGroup.PriceGroupId,
                           Price = 499.95m
                       };
productPrice.Save();&lt;/pre&gt;

&lt;p&gt;As of now, you have probably guess what the PriceGroupPriceId property will return.&lt;/p&gt;

&lt;h3&gt;Category Association&lt;/h3&gt;

&lt;p&gt;Last, but not least, you probably want to add the product to one or more categories. This is done using the CategoryProductRelation class.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;var category = Category.SingleOrDefault(x =&amp;gt; x.Name == &lt;span class="str"&gt;&amp;quot;Software&amp;quot;&lt;/span&gt;);
var relation = &lt;span class="kwrd"&gt;new&lt;/span&gt; CategoryProductRelation
                   {
                       ProductId = product.ProductId,
                       CategoryId = category.CategoryId
                   };
relation.Save();&lt;/pre&gt;

&lt;p&gt;That’s it, the new product is ready to be sold!&lt;/p&gt;

&lt;p&gt;Let me know if you have any issues or questions.&lt;/p&gt;

&lt;h3&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/h3&gt;

&lt;h3&gt;Updated – How To Set Custom Properties&lt;/h3&gt;

&lt;p&gt;If you have added custom properties to a product using product definitions, you can access the properties simply by using the indexer on the product. Note that properties are always stored as strings (nvarchar), so you need to do your own casting, depending on the type of the property. &lt;/p&gt;

&lt;pre class="csharpcode"&gt;var property = product[&lt;span class="str"&gt;&amp;quot;MyProperty&amp;quot;&lt;/span&gt;];
property.Value = &lt;span class="str"&gt;&amp;quot;New value&amp;quot;&lt;/span&gt;;
property.Save();&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://feeds.feedburner.com/~r/lasseeskildsen/cWRY/~4/SbyKS9RKszw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/lasseeskildsen/cWRY/~3/SbyKS9RKszw/post.aspx</link>
      <author>leskil</author>
      <comments>http://blog.lasseeskildsen.net/post/uCommerce-How-To-Create-A-Product-Using-The-API.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lasseeskildsen.net/post.aspx?id=8ae45b11-4691-4dba-a17d-8aab75e48cad</guid>
      <pubDate>Thu, 07 Jan 2010 06:31:18 +1100</pubDate>
      <category>uCommerce</category>
      <dc:publisher>leskil</dc:publisher>
      <pingback:server>http://blog.lasseeskildsen.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.lasseeskildsen.net/post.aspx?id=8ae45b11-4691-4dba-a17d-8aab75e48cad</pingback:target>
      <slash:comments>235</slash:comments>
      <trackback:ping>http://blog.lasseeskildsen.net/trackback.axd?id=8ae45b11-4691-4dba-a17d-8aab75e48cad</trackback:ping>
      <wfw:comment>http://blog.lasseeskildsen.net/post/uCommerce-How-To-Create-A-Product-Using-The-API.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lasseeskildsen.net/syndication.axd?post=8ae45b11-4691-4dba-a17d-8aab75e48cad</wfw:commentRss>
    <feedburner:origLink>http://blog.lasseeskildsen.net/post.aspx?id=8ae45b11-4691-4dba-a17d-8aab75e48cad</feedburner:origLink></item>
    <item>
      <title>Setting Up Simple URL Rewriting In uCommerce</title>
      <description>&lt;p&gt;With uCommerce comes a simple sample implementation of a complete store, which you can use as inspiration for getting started. &lt;a href="http://blog.lasseeskildsen.net/image.axd?picture=image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.lasseeskildsen.net/image.axd?picture=image_thumb_6.png" width="143" height="166" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The sample store uses the query string to pass catalog-, category-, and product names when redirecting to other pages where this information is needed, for example when browsing the catalog. &lt;/p&gt;  &lt;p&gt;If you want search engine friendly URLs instead, you can configure Umbraco’s URL rewriting to include your uCommerce content too, and here is how. &lt;/p&gt;  &lt;p&gt;Open the file UrlRewriting.config placed in the /config folder in the root of your Umbraco installation, and add the following elements to the &amp;lt;rewrites&amp;gt; element:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ProductRewrite&amp;quot;&lt;/span&gt;
     &lt;span class="attr"&gt;virtualUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;^/shop/(.*)/(.*)/(.*).aspx&amp;quot;&lt;/span&gt;
     &lt;span class="attr"&gt;rewriteUrlParameter&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ExcludeFromClientQueryString&amp;quot;&lt;/span&gt;
     &lt;span class="attr"&gt;destinationUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;~/shop/product.aspx?catalog=$1&amp;amp;amp;category=$2&amp;amp;amp;product=$3&amp;quot;&lt;/span&gt;
     &lt;span class="attr"&gt;ignoreCase&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;CategoryRewrite&amp;quot;&lt;/span&gt;
     &lt;span class="attr"&gt;virtualUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;^/shop/(.*)/(.*).aspx&amp;quot;&lt;/span&gt;
     &lt;span class="attr"&gt;rewriteUrlParameter&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ExcludeFromClientQueryString&amp;quot;&lt;/span&gt;
     &lt;span class="attr"&gt;destinationUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;~/shop/catalog.aspx?catalog=$1&amp;amp;amp;category=$2&amp;quot;&lt;/span&gt;
     &lt;span class="attr"&gt;ignoreCase&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;CatalogRewrite&amp;quot;&lt;/span&gt;
     &lt;span class="attr"&gt;virtualUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;^/shop/(.*).aspx&amp;quot;&lt;/span&gt;
     &lt;span class="attr"&gt;rewriteUrlParameter&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ExcludeFromClientQueryString&amp;quot;&lt;/span&gt;
     &lt;span class="attr"&gt;destinationUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;~/shop/catalog.aspx?catalog=$1&amp;quot;&lt;/span&gt;
     &lt;span class="attr"&gt;ignoreCase&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt; This gives you pretty URLs, like these for example:&lt;/p&gt;

&lt;table border="0" cellspacing="0" cellpadding="2" width="600"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="232"&gt;&lt;strong&gt;Page&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top" width="368"&gt;&lt;strong&gt;Sample URL&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="232"&gt;uCommerce catalog&lt;/td&gt;

      &lt;td valign="top" width="368"&gt;/shop/ucommerce.aspx&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="232"&gt;Software category&lt;/td&gt;

      &lt;td valign="top" width="368"&gt;/shop/ucommerce/software.aspx&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="232"&gt;Product with SKU 100-000-001&lt;/td&gt;

      &lt;td valign="top" width="368"&gt;/shop/ucommerce/software/100-000-001.aspx&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Note that you still need to modify the links in the XSLT files for the sample store to generate these URLs.&lt;/p&gt;

&lt;p&gt;The examples above are simple examples, which you probably need to adjust to your client’s needs, and your site structure. For a more comprehensive documentation on how to configure rewriting, check out the documentation for the &lt;a href="http://www.urlrewriting.net/160/en/documentation/documentation.html"&gt;UrlRewrite.net component&lt;/a&gt; that Umbraco uses.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/lasseeskildsen/cWRY/~4/ghhwTFFjS80" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/lasseeskildsen/cWRY/~3/ghhwTFFjS80/post.aspx</link>
      <author>leskil</author>
      <comments>http://blog.lasseeskildsen.net/post/Setting-Up-Simple-URL-Rewriting-In-uCommerce.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lasseeskildsen.net/post.aspx?id=1eef37eb-2126-4c97-8bef-07e40a5b7816</guid>
      <pubDate>Tue, 01 Dec 2009 07:32:51 +1100</pubDate>
      <category>uCommerce</category>
      <dc:publisher>leskil</dc:publisher>
      <pingback:server>http://blog.lasseeskildsen.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.lasseeskildsen.net/post.aspx?id=1eef37eb-2126-4c97-8bef-07e40a5b7816</pingback:target>
      <slash:comments>154</slash:comments>
      <trackback:ping>http://blog.lasseeskildsen.net/trackback.axd?id=1eef37eb-2126-4c97-8bef-07e40a5b7816</trackback:ping>
      <wfw:comment>http://blog.lasseeskildsen.net/post/Setting-Up-Simple-URL-Rewriting-In-uCommerce.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lasseeskildsen.net/syndication.axd?post=1eef37eb-2126-4c97-8bef-07e40a5b7816</wfw:commentRss>
    <feedburner:origLink>http://blog.lasseeskildsen.net/post.aspx?id=1eef37eb-2126-4c97-8bef-07e40a5b7816</feedburner:origLink></item>
    <item>
      <title>Extending uCommerce Admin</title>
      <description>&lt;p&gt;&lt;a href="http://blog.lasseeskildsen.net/image.axd?picture=image_5.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.lasseeskildsen.net/image.axd?picture=image_thumb_5.png" width="260" height="194" /&gt;&lt;/a&gt;When working with the different entities in uCommerce admin, you have the option to add additional tabs to each view, so that you can integrate your own user controls in uCommerce admin.&lt;/p&gt;  &lt;h3&gt;Configuring Tabs&lt;/h3&gt;  &lt;p&gt;To add more tabs to a view, you need to go to the database, and add your tab to the ucommerce_admintab table. To find out which view (page) the tab is related to, take a look at the ucommerce_adminpage table.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The following table contains the columns in ucommerce_admintab which should be of interest to you:&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="594"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="159"&gt;&lt;strong&gt;Column&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="435"&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="159"&gt;VirtualPath&lt;/td&gt;        &lt;td valign="top" width="435"&gt;The virtual path of your user control (.ascx). The path is relative to the page you want the tab to appear on. Note that you can use both ~/ and ../.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="159"&gt;AdminPageId&lt;/td&gt;        &lt;td valign="top" width="435"&gt;The page where the tab should be placed on, defined in ucommerce_adminpage.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="159"&gt;SortOrder&lt;/td&gt;        &lt;td valign="top" width="435"&gt;Defines how the tabs for the page should be ordered.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="159"&gt;Multilingual&lt;/td&gt;        &lt;td valign="top" width="435"&gt;If set to true, one tab of the type is added per language configured in Umbraco.          &lt;br /&gt;&lt;strong&gt;Note:&lt;/strong&gt; Multilinual tabs should implement the IMultilingual interface – more about this later.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="159"&gt;ResourceKey&lt;/td&gt;        &lt;td valign="top" width="435"&gt;Put the text on your tab here. This will be overriden by the language name if you specify your tab to be multilingual.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="159"&gt;HasSaveButton&lt;/td&gt;        &lt;td valign="top" width="435"&gt;If set to true, the save button will be visible on the toolbar for this tab.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="159"&gt;HasDeleteButton&lt;/td&gt;        &lt;td valign="top" width="435"&gt;The same as HasSaveButton, only for a delete button.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="159"&gt;Enabled&lt;/td&gt;        &lt;td valign="top" width="435"&gt;Yes, you can both enable and disable tabs.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h3&gt;Implementing User Controls For Use On Tabs&lt;/h3&gt;  &lt;p&gt;To create the user control you want on your new tab, simply create a new project in Visual Studio, create a reference to UCommerce.Presentation.dll, create a new user control, and make that user control inherit from UCommerce.Presentation.Web.ViewEnabledControl&amp;lt;T&amp;gt;. The generic parameter T must be the type of the view you want your control to appear on. This is necessary so that they can interact. &lt;/p&gt;  &lt;p&gt;You’ll find a list of the most commonly used view here:&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="600"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="213"&gt;&lt;strong&gt;View&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="385"&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="213"&gt;Edit product catalog group&lt;/td&gt;        &lt;td valign="top" width="385"&gt;IEditProductCatalogGroupView&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="213"&gt;Edit product catalog&lt;/td&gt;        &lt;td valign="top" width="385"&gt;IEditProductCatalogView&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="213"&gt;Edit category&lt;/td&gt;        &lt;td valign="top" width="385"&gt;IEditCategory&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="213"&gt;Edit product&lt;/td&gt;        &lt;td valign="top" width="385"&gt;IEditProduct&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="213"&gt;View order&lt;/td&gt;        &lt;td valign="top" width="385"&gt;IViewOrderGroupView&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;There are one for each view in uCommerce, and should be pretty easy to find. Let me know if there is one you can’t find.&lt;/p&gt;  &lt;p&gt;From your user control, there are two events that is of interest to subscribe to:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler&amp;lt;EntityCommandEventArgs&amp;lt;T&amp;gt;&amp;gt; Saving;
&lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler&amp;lt;EntityCommandEventArgs&amp;lt;T&amp;gt;&amp;gt; Saved;&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;The Saving event is raised before the main entity (e.g. Product on IEditProductView) is saved, and the Saved event is raised after the main entity has been saved. If you want to modify the main entity before it is saved, do it at the Saving event. The EntityCommandEventArgs&amp;lt;T&amp;gt; will pass you a reference to the main entity.&lt;/p&gt;

&lt;p&gt;For some views, you can also subscribe to these two events, which are raised when deleting the entity – they are handy for doing some cleanup:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler&amp;lt;EntityCommandEventArgs&amp;lt;T&amp;gt;&amp;gt; Deleting;
&lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler&amp;lt;EntityCommandEventArgs&amp;lt;T&amp;gt;&amp;gt; Deleted;&lt;/pre&gt;

&lt;p&gt;From your user control, you also have access to the view itself using the View-property on the ViewEnabledControl&amp;lt;T&amp;gt; you inherit from.&lt;/p&gt;

&lt;h5&gt;Creating Mutlilingual Tabs&lt;/h5&gt;

&lt;p&gt;As previously mentioned, you can make your tabs multilingual by implementing the IMultilingual interface. By doing this, one tab containing your user contorl will appear for each language configured in Umbraco. The CultureCode property will automatically be set to the culture code of the language for the tab.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// Contains definition for a multi lingual class.&lt;/span&gt;
&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IMultiLingual
{
    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// The culture code.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;example&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// da-DK for Denmark, en-GB for Great Britian etc.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/example&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;string&lt;/span&gt; CultureCode { get; set; }
}&lt;/pre&gt;

&lt;h5&gt;Custom Initialization On Tabs&lt;/h5&gt;

&lt;p&gt;If you want custom initialization on your tab, you can implement the IHasTabPage interface.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// Defines if an user control exists on a tab page.&lt;/span&gt;
&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IHasTabPage
{
    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Initializes the tab page.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;remarks&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// This is where the menu should be initialized.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/remarks&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;tabPage&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;void&lt;/span&gt; InitializeTabPage(TabPage tabPage);

    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Gets a value indicating whether or not this tab should be displayed.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;bool&lt;/span&gt; ShowTab { get; }
}&lt;/pre&gt;

&lt;p&gt;If, for example, you want to add your own custom button to the toolbar, you can do it like this:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InitializeTabPage(TabPage tabPage)
{
    var myButton = tabPage.Menu.NewImageButton();
    myButton.AlternateText = &lt;span class="str"&gt;&amp;quot;This is the tool tip&amp;quot;&lt;/span&gt;;
    myButton.ImageUrl = &lt;span class="str"&gt;&amp;quot;/images/MyToolbarButton.png&amp;quot;&lt;/span&gt;;
    myButton.Click += MyButton_OnClick;
}&lt;/pre&gt;

&lt;p&gt;When you are done with your user control, copy the .ascx to the path you have specified in ucommerce_admintab, copy the dll to the /bin folder, and your new tab should be ready for use.&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;p&gt;Extending the admin UI is not something you would for every solution, but if you have the need, it can add great value for your client.&lt;/p&gt;

&lt;p&gt;As always, let me know if you have any questions.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/lasseeskildsen/cWRY/~4/8ZLUcOjFmns" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/lasseeskildsen/cWRY/~3/8ZLUcOjFmns/post.aspx</link>
      <author>leskil</author>
      <comments>http://blog.lasseeskildsen.net/post/Extending-uCommerce-Admin.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lasseeskildsen.net/post.aspx?id=e5b27564-f930-4805-a143-61818cc6b6f7</guid>
      <pubDate>Mon, 30 Nov 2009 08:32:09 +1100</pubDate>
      <category>uCommerce</category>
      <dc:publisher>leskil</dc:publisher>
      <pingback:server>http://blog.lasseeskildsen.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.lasseeskildsen.net/post.aspx?id=e5b27564-f930-4805-a143-61818cc6b6f7</pingback:target>
      <slash:comments>298</slash:comments>
      <trackback:ping>http://blog.lasseeskildsen.net/trackback.axd?id=e5b27564-f930-4805-a143-61818cc6b6f7</trackback:ping>
      <wfw:comment>http://blog.lasseeskildsen.net/post/Extending-uCommerce-Admin.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lasseeskildsen.net/syndication.axd?post=e5b27564-f930-4805-a143-61818cc6b6f7</wfw:commentRss>
    <feedburner:origLink>http://blog.lasseeskildsen.net/post.aspx?id=e5b27564-f930-4805-a143-61818cc6b6f7</feedburner:origLink></item>
    <item>
      <title>Understanding uCommerce Order Statuses</title>
      <description>&lt;p&gt;When implementing an e-commerce solution, you might need to adapt your solution to either your own, or your client’s order fulfillment process. To support a flexible workflow around this process, uCommerce supports configurable order statuses.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.lasseeskildsen.net/image.axd?picture=image_1.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.lasseeskildsen.net/image.axd?picture=image_thumb_1.png" width="196" height="200" /&gt;&lt;/a&gt;Out of the box, uCommerce comes with 5 statuses preconfigured. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;New order &lt;/li&gt;    &lt;li&gt;Completed order &lt;/li&gt;    &lt;li&gt;Invoiced &lt;/li&gt;    &lt;li&gt;Paid &lt;/li&gt;    &lt;li&gt;Cancelled &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Each status can be configured as being part of the fulfillment process.&lt;/p&gt;  &lt;p&gt;To edit each status, you need to start &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=08E52AC2-1D62-45F6-9A4A-4B76A8564A2B&amp;amp;displaylang=en"&gt;the developer’s swiss army knife of configuration&lt;/a&gt;, and open the ucommerce_orderstatus table.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.lasseeskildsen.net/image.axd?picture=image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.lasseeskildsen.net/image.axd?picture=image_thumb_2.png" width="600" height="91" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Note that there are a 6th status – Basket. This is used to handle baskets on the public facing site, so please do not delete it. &lt;/p&gt;  &lt;p&gt;You should note the following columns:&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="597"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="155"&gt;&lt;strong&gt;Column&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="440"&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="155"&gt;OrderStatusId&lt;/td&gt;        &lt;td valign="top" width="440"&gt;The primary key of the order status.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="155"&gt;Name&lt;/td&gt;        &lt;td valign="top" width="440"&gt;The name of the status, displayed under the Orders-node in uCommerce admin.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="155"&gt;Sort&lt;/td&gt;        &lt;td valign="top" width="440"&gt;The sort order in uCommerce admin.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="155"&gt;RenderChildren&lt;/td&gt;        &lt;td valign="top" width="440"&gt;Defines whether or not orders should be rendered in the tree for this status. Handy for the final order status, where you hopefully will have a lot of orders.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="155"&gt;NextOrderStatusId&lt;/td&gt;        &lt;td valign="top" width="440"&gt;Defines which status (referenced by OrderStatusId) is the next in the order process. For example, a new order can only be promoted to a completed order.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="155"&gt;IncludeInAuditTrail&lt;/td&gt;        &lt;td valign="top" width="440"&gt;If set to true, the audit trail will be updated when an order’s status is set to this status.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="155"&gt;AllowUpdate&lt;/td&gt;        &lt;td valign="top" width="440"&gt;If set to false, no more status changes can be made to orders with this status.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="155"&gt;AlwaysAvailable&lt;/td&gt;        &lt;td valign="top" width="440"&gt;If set to true, this status is always available from any order status, except for those where AllowUpdate is set to false. Handy for a cancelled-status.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="155"&gt;Pipeline&lt;/td&gt;        &lt;td valign="top" width="440"&gt;Here you can put the name of a pipeline you would like executed when an order is set to this status. For example, when an order is set to &lt;em&gt;Invoiced&lt;/em&gt;, you might want to capture an online payment, or if an order is returned, you want to put the products back in stock and debit the customer’s account.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;When viewing an order in uCommerce admin, you can change an order’s status by clicking the “Change Status” button in the toolbar.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;In the Update Order Status popup, the rules you set up in the ucommerce_orderstatus table is followed, and the user cannot bypass the defined order flow. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt; &lt;a href="http://blog.lasseeskildsen.net/image.axd?picture=image_3.png"&gt;&lt;img style="border-right-width: 0px; margin: 0px 20px 0px 15px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.lasseeskildsen.net/image.axd?picture=image_thumb_3.png" width="244" height="144" /&gt;&lt;/a&gt;&lt;a href="http://blog.lasseeskildsen.net/image.axd?picture=image_4.png"&gt;&lt;img style="border-right-width: 0px; margin: 0px 15px 0px 20px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.lasseeskildsen.net/image.axd?picture=image_thumb_4.png" width="244" height="136" /&gt;&lt;/a&gt;  &lt;p&gt;If you want to know more about pipelines, take a look at &lt;a href="http://blog.lasseeskildsen.net/post/uCommerce-Pipelines-Explained.aspx"&gt;my previous post&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;That’s all there is to it – let me know if you have any questions.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/lasseeskildsen/cWRY/~4/iiUqtEO_qhU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/lasseeskildsen/cWRY/~3/iiUqtEO_qhU/post.aspx</link>
      <author>leskil</author>
      <comments>http://blog.lasseeskildsen.net/post/Understanding-uCommerce-Order-Statuses.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lasseeskildsen.net/post.aspx?id=494f9257-e822-4b45-b4ed-ea80546a9ee2</guid>
      <pubDate>Wed, 25 Nov 2009 08:04:55 +1100</pubDate>
      <category>uCommerce</category>
      <dc:publisher>leskil</dc:publisher>
      <pingback:server>http://blog.lasseeskildsen.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.lasseeskildsen.net/post.aspx?id=494f9257-e822-4b45-b4ed-ea80546a9ee2</pingback:target>
      <slash:comments>173</slash:comments>
      <trackback:ping>http://blog.lasseeskildsen.net/trackback.axd?id=494f9257-e822-4b45-b4ed-ea80546a9ee2</trackback:ping>
      <wfw:comment>http://blog.lasseeskildsen.net/post/Understanding-uCommerce-Order-Statuses.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lasseeskildsen.net/syndication.axd?post=494f9257-e822-4b45-b4ed-ea80546a9ee2</wfw:commentRss>
    <feedburner:origLink>http://blog.lasseeskildsen.net/post.aspx?id=494f9257-e822-4b45-b4ed-ea80546a9ee2</feedburner:origLink></item>
    <item>
      <title>Internet Caching Must Reads</title>
      <description>&lt;p&gt;Usually, when people (developer-people, that is) think about caching, they think of the local cache, which will hold cached data from the database, for example.&lt;/p&gt;  &lt;p&gt;Lucky for us, and little known to others, there are a lot more to caching than HttpContext.Current.Cache and Enterprise Library. This article explains all the Internet caching intermediates out there, and reading it is time well spent: &lt;a href="http://www.mnot.net/cache_docs/"&gt;http://www.mnot.net/cache_docs/&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/lasseeskildsen/cWRY/~4/9l7ZMpLV5HQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/lasseeskildsen/cWRY/~3/9l7ZMpLV5HQ/post.aspx</link>
      <author>leskil</author>
      <comments>http://blog.lasseeskildsen.net/post/Internet-Caching-Must-Reads.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lasseeskildsen.net/post.aspx?id=bf94df8c-b639-4982-8670-a52b56ba907c</guid>
      <pubDate>Wed, 11 Nov 2009 07:52:08 +1100</pubDate>
      <category>.NET</category>
      <category>ASP.NET</category>
      <dc:publisher>leskil</dc:publisher>
      <pingback:server>http://blog.lasseeskildsen.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.lasseeskildsen.net/post.aspx?id=bf94df8c-b639-4982-8670-a52b56ba907c</pingback:target>
      <slash:comments>57</slash:comments>
      <trackback:ping>http://blog.lasseeskildsen.net/trackback.axd?id=bf94df8c-b639-4982-8670-a52b56ba907c</trackback:ping>
      <wfw:comment>http://blog.lasseeskildsen.net/post/Internet-Caching-Must-Reads.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lasseeskildsen.net/syndication.axd?post=bf94df8c-b639-4982-8670-a52b56ba907c</wfw:commentRss>
    <feedburner:origLink>http://blog.lasseeskildsen.net/post.aspx?id=bf94df8c-b639-4982-8670-a52b56ba907c</feedburner:origLink></item>
    <item>
      <title>uCommerce Pipelines Explained</title>
      <description>&lt;p&gt;One of the things you will need when building complex sites with uCommerce is the pipeline system. &lt;/p&gt;  &lt;p&gt;A pipeline is a series of tasks, which will execute in a sequental order. You can use these tasks to execute whatever business logic you want, when working with baskets or orders. Currently, the pipeline system only applies to baskets and orders. &lt;/p&gt;  &lt;h3&gt;The Bits and Pieces of a Pipeline&lt;/h3&gt;  &lt;p&gt;A pipeline consists of three things:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The pipeline configuration file itself (an XML file) &lt;/li&gt;    &lt;li&gt;An optional pipeline implementation (written in your favorite .net language) &lt;/li&gt;    &lt;li&gt;One or more pipeline tasks (also written in anything .net-ish) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The configuration file contains the type of the pipeline, each registered pipeline task and the order of which the tasks will be executed.&lt;/p&gt;  &lt;p&gt;The file must be located in the /umbraco/ucommerce/pipelines folder. As you can see in the folder, uCommerce comes with a pipeline out-of-the-box – the basket pipeline. Take a look at basket.config to see how it is configured.&lt;/p&gt;  &lt;h3&gt;The Configuration File&lt;/h3&gt;  &lt;p&gt;The first &lt;em&gt;component&lt;/em&gt; section contains the type of the pipeline, which is a generic type. As mentioned earlier, only baskets and orders are currently supported, which means that the generic type should be UCommerce.Entities.PurchaseOrder (which also applies to baskets). The pipeline type used in the basket pipeline is UCommerce.Pipelines.Basket.BasketPipeline. If you want to implement your own pipeline, you can use the generic type UCommerce.Pipelines.Generic.PurchaseOrderPipeline defined in the UCommerce.Pipelines assembly.&lt;a href="http://blog.lasseeskildsen.net/image.axd?picture=image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.lasseeskildsen.net/image.axd?picture=image_thumb.png" width="244" height="149" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;After the pipeline type, each pipeline step is defined, each in it’s own &lt;em&gt;component &lt;/em&gt;section with an id. The id is then used in the &amp;lt;tasks&amp;gt; section under the pipeline type to add the task the pipeline, which will then execute the task. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The order of which each task is registered in the &amp;lt;task&amp;gt; section, is the same as the order as they will be executed in.&lt;/p&gt;  &lt;h3&gt;Writing Pipeline Tasks&lt;/h3&gt;  &lt;p&gt;Ok, so enough with the XML for now. &lt;/p&gt;  &lt;p&gt;To create your own pipeline task, simply implement the IPipelineTask&amp;lt;T&amp;gt; interface.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Contains definition for a pipeline task.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;The type on which the task operates on.&amp;lt;/typeparam&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IPipelineTask&amp;lt;T&amp;gt;
    {
        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Executes the task.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;subject&amp;quot;&amp;gt;The subject for the task.&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
        PipelineExecutionResult Execute(T subject);&lt;/pre&gt;
&lt;style type="text/css"&gt;








.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;The task must return a &lt;script type="text/javascript" src="http://blog.lasseeskildsen.net/editors/tiny_mce3/themes/advanced/langs/en.js"&gt;&lt;/script&gt;member of the PipelineExecution Result enum.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Result returned when executing a pipeline or a pipeline task.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; PipelineExecutionResult
    {
        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// The pipeline or task executed sucessfully.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        Success,
        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// The pipeline or task has been executed, but with warnings.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        Warning,
        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// The pipeline or task generated an error.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        Error
    }&lt;/pre&gt;
&lt;style type="text/css"&gt;







.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;If the task returns &lt;em&gt;Success&lt;/em&gt;, the execution of the pipeline will continue. If you return &lt;em&gt;Warning&lt;/em&gt;, the execution will continue, but the overall execution result for the entire pipeline will be set to &lt;em&gt;Warning&lt;/em&gt;. If the task returns &lt;em&gt;Error&lt;/em&gt;, the pipeline execution will stop, and no additional tasks will be executed. If any exceptions is thrown in a pipeline task, to execution will stop with a PipelineException, with the exception from the task as the inner exception.&lt;/p&gt;

&lt;h3&gt;Executing Pipelines&lt;/h3&gt;

&lt;p&gt;There are two ways to execute your pipelines:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;From code &lt;/li&gt;

  &lt;li&gt;From XSLT &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h5&gt;Executing Pipelines From Code&lt;/h5&gt;

&lt;p&gt;Executing the pipeline from code using the PipelineFactory is pretty simple:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; PipelineExecutionResult ExecutePipeline(&lt;span class="kwrd"&gt;string&lt;/span&gt; pipelineName, &lt;br /&gt;   PurchaseOrder order)
{
    var basketPipeline = PipelineFactory.Create&amp;lt;PurchaseOrder&amp;gt;(pipelineName);
    var result = basketPipeline.Execute(order);
    &lt;span class="kwrd"&gt;return&lt;/span&gt; result;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;h5&gt;Executing Pipelines From XSLT&lt;/h5&gt;

&lt;p&gt;To execute a custom pipeline from XSLT, call the ExecuteOrderPipeline(string pipelineName) method on the uCommerce XSLT library.&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&amp;lt;xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of select=&lt;span class="str"&gt;&amp;quot;CommerceLibrary:ExecuteOrderPipeline('MyPipeline')&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;/xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of&amp;gt;&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;If you want to execute the basket pipeline, you can call this nifty method instead:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&amp;lt;xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of select=&lt;span class="str"&gt;&amp;quot;CommerceLibrary:ExecuteBasketPipeline()&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/xsl:&lt;span class="kwrd"&gt;value&lt;/span&gt;-of&amp;gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;h1&gt;&lt;/h1&gt;

&lt;p&gt;Both of the above methods will return the pipeline execution result as XML. If an exception has occured, the exception message will be included in the XML.&lt;/p&gt;

&lt;h3&gt;So What’s Up With That Basket Pipeline?&lt;/h3&gt;

&lt;p&gt;The basket pipeline is a built-in pipeline used by the uCommerce runtime. The pipeline will make sure that all e.g. all totals are recalculated. Please do not delete it, but feel free to add your own tasks, if there’s anything you need on recalculating the basket.&lt;/p&gt;

&lt;h3&gt;A Short Note On Order Statuses And Pipelines&lt;/h3&gt;

&lt;p&gt;Customization of order statuses is the topic for an upcoming post, but you should know that you can execute pipelines after order status changes. Order statuses are configured in the uCommerce_OrderStatus table. To run a pipeline when an order has been set to a given status, simply but your pipeline name in the “Pipeline” column. If you e.g. want to capture an online payment, this would be a great place to do it.&lt;/p&gt;

&lt;p&gt;That’s it for the pipelines. Feel free to contact me if you need more info on the pipeline system.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/lasseeskildsen/cWRY/~4/jIYebKWtIr4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/lasseeskildsen/cWRY/~3/jIYebKWtIr4/post.aspx</link>
      <author>leskil</author>
      <comments>http://blog.lasseeskildsen.net/post/uCommerce-Pipelines-Explained.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lasseeskildsen.net/post.aspx?id=30fbcd6e-8189-46f5-b2ea-28b91aa0397a</guid>
      <pubDate>Tue, 10 Nov 2009 05:47:00 +1100</pubDate>
      <category>uCommerce</category>
      <dc:publisher>leskil</dc:publisher>
      <pingback:server>http://blog.lasseeskildsen.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.lasseeskildsen.net/post.aspx?id=30fbcd6e-8189-46f5-b2ea-28b91aa0397a</pingback:target>
      <slash:comments>133</slash:comments>
      <trackback:ping>http://blog.lasseeskildsen.net/trackback.axd?id=30fbcd6e-8189-46f5-b2ea-28b91aa0397a</trackback:ping>
      <wfw:comment>http://blog.lasseeskildsen.net/post/uCommerce-Pipelines-Explained.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lasseeskildsen.net/syndication.axd?post=30fbcd6e-8189-46f5-b2ea-28b91aa0397a</wfw:commentRss>
    <feedburner:origLink>http://blog.lasseeskildsen.net/post.aspx?id=30fbcd6e-8189-46f5-b2ea-28b91aa0397a</feedburner:origLink></item>
    <item>
      <title>New blog, not a completly new blogger</title>
      <description>&lt;p&gt;I have been blogging on weblogs.asp.net/lasse for a while, but since we started the beta for uCommerce, I have decided to move my blog here instead. Anytime soon I will be moving my old posts to this blog.&lt;/p&gt;  &lt;p&gt;Stay tuned.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/lasseeskildsen/cWRY/~4/S_gWuyBKBuI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/lasseeskildsen/cWRY/~3/S_gWuyBKBuI/post.aspx</link>
      <author>leskil</author>
      <comments>http://blog.lasseeskildsen.net/post/New-blog-not-a-completly-new-blogger.aspx#comment</comments>
      <guid isPermaLink="false">http://blog.lasseeskildsen.net/post.aspx?id=5af98c8b-7220-4fdd-943a-c5d598cfb0a0</guid>
      <pubDate>Sat, 27 Jun 2009 06:43:20 +1100</pubDate>
      <category>uCommerce</category>
      <category>Blog</category>
      <dc:publisher>leskil</dc:publisher>
      <pingback:server>http://blog.lasseeskildsen.net/pingback.axd</pingback:server>
      <pingback:target>http://blog.lasseeskildsen.net/post.aspx?id=5af98c8b-7220-4fdd-943a-c5d598cfb0a0</pingback:target>
      <slash:comments>14</slash:comments>
      <trackback:ping>http://blog.lasseeskildsen.net/trackback.axd?id=5af98c8b-7220-4fdd-943a-c5d598cfb0a0</trackback:ping>
      <wfw:comment>http://blog.lasseeskildsen.net/post/New-blog-not-a-completly-new-blogger.aspx#comment</wfw:comment>
      <wfw:commentRss>http://blog.lasseeskildsen.net/syndication.axd?post=5af98c8b-7220-4fdd-943a-c5d598cfb0a0</wfw:commentRss>
    <feedburner:origLink>http://blog.lasseeskildsen.net/post.aspx?id=5af98c8b-7220-4fdd-943a-c5d598cfb0a0</feedburner:origLink></item>
  </channel>
</rss>
