<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.ent0.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>Mike_Brockey[0].Blog() : MetaWeblogAPI, WindowsLiveWriter</title><link>http://blogs.ent0.com/blogs/mikebrockey/archive/tags/MetaWeblogAPI/WindowsLiveWriter/default.aspx</link><description>Tags: MetaWeblogAPI, WindowsLiveWriter</description><dc:language>en</dc:language><generator>CommunityServer 2.1 (Build: 60809.935)</generator><item><title>Using MetaWeblog API and Windows Live Writer to Manage Dynamic Website Content</title><link>http://blogs.ent0.com/blogs/mikebrockey/archive/2007/02/04/Using-MetaWeblog-API-and-Windows-Live-Writer-to-Manage-Dynamic-Website-Content.aspx</link><pubDate>Sun, 04 Feb 2007 20:05:19 GMT</pubDate><guid isPermaLink="false">ee1c7808-4f42-4204-b975-d4fb46b09af1:108</guid><dc:creator>mike.brockey</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.ent0.com/blogs/mikebrockey/comments/108.aspx</comments><wfw:commentRss>http://blogs.ent0.com/blogs/mikebrockey/commentrss.aspx?PostID=108</wfw:commentRss><description>&lt;p&gt;I built the &lt;a title="Miles Ahead Farm" href="http://www.milesaheadfarm.com/" target="_blank"&gt;Miles Ahead Farm Website&lt;/a&gt; a few years ago. I built it for a friend of ours with the intention that my wife would manage the content.&amp;nbsp; I built some administrative functionality using the &lt;a title="FreeTextBox - The no. 1 free ASP.NET HTML Editor." href="http://freetextbox.com/default.aspx" target="_blank"&gt;FreeTextBox&lt;/a&gt; control as a rich content editor.&amp;nbsp; It worked out great as it allowed Amy to very easily make textual and formatting changes without much hassle.&amp;nbsp; The problem was that any time she wanted to upload images (which was often), I would still have to format, upload and insert the image. It wasn't a painful process, but I'm always looking for ways to make my life a little easier.&lt;/p&gt; &lt;p&gt;I then&amp;nbsp;came across &lt;a title="Introducing Windows Live Writer" href="http://windowslivewriter.spaces.live.com/blog/cns!D85741BB5E0BE8AA!174.entry" target="_blank"&gt;Windows Live Writer&lt;/a&gt;.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;"Windows Live Writer&amp;nbsp;is a desktop application that makes it easier to compose compelling blog posts using &lt;a href="http://spaces.live.com/"&gt;Windows Live Spaces&lt;/a&gt; or your current blog service.&amp;nbsp;"&amp;nbsp; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;It has a few very compelling features including WYSIWYG Authoring, Photo Publishing and a Writer SDK. Now if only I could figure out how to make Writer communicate with my&amp;nbsp;dynamic website engine.&lt;/p&gt; &lt;p&gt;I found that Live Writer supports the &lt;a title="RFC: MetaBlogAPI" href="http://www.xmlrpc.com/metaWeblogApi" target="_blank"&gt;MetaWeblog API&lt;/a&gt;.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;"The &lt;a title="RFC: MetaBlogAPI" href="http://www.xmlrpc.com/metaWeblogApi" target="_blank"&gt;MetaWeblog API&lt;/a&gt;&amp;nbsp;(MWA) is a programming interface that allows external programs to get and set the text and attributes of weblog posts. It builds on the popular XML-RPC communication protocol, with &lt;a href="http://www.xmlrpc.com/directory/1568/implementations"&gt;implementations&lt;/a&gt; available in many popular programming environments."&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;After only a few moments of "using the Google", I&amp;nbsp;across a&amp;nbsp;&lt;a title="Coding blog engine with MetaWeblog API support and using it with Windows Live Writer" href="http://www.gtrifonov.com/blog/2006/10/09/Coding+blog+engine+with+MetaWeblog+API+support+and+using+it+with+Windows+Live+Writer.aspx" target="_blank"&gt;blog by George Trifonov&lt;/a&gt; that&amp;nbsp;explained and provided example C# source&amp;nbsp;of how to implement a blog engine that can communicate via the MetaWeblog API.&lt;/p&gt; &lt;p&gt;It was quickly obvious to me that it would take less code and make more sense to write a new dynamic website engine that reads the website content from the rss formatted file that George's code was already generating.&lt;/p&gt; &lt;p&gt;Using the Global_BeginRequest method in the Global Application Class, I wrote a quick function that inspects the incoming request file path and rewrites the path for server processing. This means that the incoming request of "Facilities.aspx" would be forwarded to page on the server called "ShowPage.aspx" with the url in the query string. i.e. (&lt;em&gt;ShowPage.aspx?url=Facilities.aspx&lt;/em&gt;)&lt;/p&gt; &lt;p&gt;&lt;span&gt; &lt;table&gt;  &lt;tr&gt; &lt;td&gt;&lt;pre class="code"&gt;&lt;span&gt;        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Global_BeginRequest(&lt;span&gt;object&lt;/span&gt; sender, &lt;span&gt;EventArgs&lt;/span&gt; e)
        {
            &lt;span&gt;string&lt;/span&gt; filename = &lt;span&gt;Path&lt;/span&gt;.GetFileName(&lt;span&gt;HttpContext&lt;/span&gt;.Current.Request.FilePath).ToLower();
            &lt;span&gt;switch&lt;/span&gt;(filename)
            {
                &lt;span&gt;case&lt;/span&gt; &lt;span&gt;"showpage.aspx"&lt;/span&gt;:
                &lt;span&gt;case&lt;/span&gt; &lt;span&gt;"webresource.axd"&lt;/span&gt;:
                &lt;span&gt;case&lt;/span&gt; &lt;span&gt;"metablogapi.ashx"&lt;/span&gt;:
                    &lt;span&gt;break&lt;/span&gt;;
                &lt;span&gt;default&lt;/span&gt;:
                    &lt;span&gt;HttpContext&lt;/span&gt;.Current.RewritePath(&lt;span&gt;"showblog.aspx?url="&lt;/span&gt; + filename);
                    &lt;span&gt;break&lt;/span&gt;;
            }
        }&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You will notice that I listed ShowPage.aspx and other static files&amp;nbsp;as pages that will be ignored by this function and allow ASP.NET to handle the request as it normally would.&lt;/p&gt;
&lt;p&gt;The next step is to build the ShowPage.aspx page that will handle the request for the dynamic page, query the storage file and output the website content.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;
&lt;table&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre class="code"&gt;&lt;span&gt;        &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Page_Load(&lt;span&gt;object&lt;/span&gt; sender, &lt;span&gt;EventArgs&lt;/span&gt; e)
        {
            &lt;span&gt;string&lt;/span&gt; linkId = Server.UrlDecode(Request[&lt;span&gt;"url"&lt;/span&gt;]);

            &lt;span&gt;XmlDocument&lt;/span&gt; doc = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;XmlDocument&lt;/span&gt;();
            doc.Load(StorageFile);
            &lt;span&gt;XmlNode&lt;/span&gt; node = doc.SelectSingleNode(&lt;span&gt;"rss/channel/item[link ='"&lt;/span&gt; + linkId + &lt;span&gt;"']"&lt;/span&gt;);
            
            &lt;span&gt;if&lt;/span&gt; (node != &lt;span&gt;null&lt;/span&gt;)
            {
                &lt;span&gt;string&lt;/span&gt; blogContent = node.SelectSingleNode(&lt;span&gt;"description"&lt;/span&gt;).InnerText;
                ContentZone.Controls.AddAt(0, &lt;span&gt;new&lt;/span&gt; &lt;span&gt;LiteralControl&lt;/span&gt;(blogContent));
            }
        }&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The code in the Page_Load method firstly loads the RSS content into an XmlDocument object and performs a search for an item with a link that matches the incoming requested url. If found, we simply grab a&amp;nbsp;reference to the description node as this is where the html content is stored. In my specific implementation for Miles Ahead Farm I've added support for output caching,&amp;nbsp;html page title and also support for loading web user controls for needs such as a contact form.&lt;/p&gt;
&lt;p&gt;You can download the &lt;strong&gt;Dynamic Website Engine Source Code&lt;/strong&gt; from our &lt;a title="EntropyZero Downloads" href="http://blogs.ent0.com/files/default.aspx"&gt;downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:81a00743-037c-4a51-80dd-f3334560b684" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;del.icio.us tags: &lt;a href="http://del.icio.us/popular/MetaWeblogAPI" rel="tag"&gt;MetaWeblogAPI&lt;/a&gt;, &lt;a href="http://del.icio.us/popular/WindowsLiveWriter" rel="tag"&gt;WindowsLiveWriter&lt;/a&gt;, &lt;a href="http://del.icio.us/popular/MilesAheadFarm" rel="tag"&gt;MilesAheadFarm&lt;/a&gt;&lt;/div&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://blogs.ent0.com/blogs/mikebrockey/archive/2007/02/04/Using-MetaWeblog-API-and-Windows-Live-Writer-to-Manage-Dynamic-Website-Content.aspx&amp;amp;;subject=Using+MetaWeblog+API+and+Windows+Live+Writer+to+Manage+Dynamic+Website+Content" target="_blank" title = "Post http://blogs.ent0.com/blogs/mikebrockey/archive/2007/02/04/Using-MetaWeblog-API-and-Windows-Live-Writer-to-Manage-Dynamic-Website-Content.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blogs.ent0.com/blogs/mikebrockey/archive/2007/02/04/Using-MetaWeblog-API-and-Windows-Live-Writer-to-Manage-Dynamic-Website-Content.aspx&amp;amp;;title=Using+MetaWeblog+API+and+Windows+Live+Writer+to+Manage+Dynamic+Website+Content" target="_blank" title = "Post http://blogs.ent0.com/blogs/mikebrockey/archive/2007/02/04/Using-MetaWeblog-API-and-Windows-Live-Writer-to-Manage-Dynamic-Website-Content.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blogs.ent0.com/blogs/mikebrockey/archive/2007/02/04/Using-MetaWeblog-API-and-Windows-Live-Writer-to-Manage-Dynamic-Website-Content.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blogs.ent0.com/blogs/mikebrockey/archive/2007/02/04/Using-MetaWeblog-API-and-Windows-Live-Writer-to-Manage-Dynamic-Website-Content.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blogs.ent0.com/blogs/mikebrockey/archive/2007/02/04/Using-MetaWeblog-API-and-Windows-Live-Writer-to-Manage-Dynamic-Website-Content.aspx&amp;amp;title=Using+MetaWeblog+API+and+Windows+Live+Writer+to+Manage+Dynamic+Website+Content" target="_blank" title = "Post http://blogs.ent0.com/blogs/mikebrockey/archive/2007/02/04/Using-MetaWeblog-API-and-Windows-Live-Writer-to-Manage-Dynamic-Website-Content.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blogs.ent0.com/blogs/mikebrockey/archive/2007/02/04/Using-MetaWeblog-API-and-Windows-Live-Writer-to-Manage-Dynamic-Website-Content.aspx&amp;amp;;title=Using+MetaWeblog+API+and+Windows+Live+Writer+to+Manage+Dynamic+Website+Content" target="_blank" title = "Post http://blogs.ent0.com/blogs/mikebrockey/archive/2007/02/04/Using-MetaWeblog-API-and-Windows-Live-Writer-to-Manage-Dynamic-Website-Content.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blogs.ent0.com/blogs/mikebrockey/archive/2007/02/04/Using-MetaWeblog-API-and-Windows-Live-Writer-to-Manage-Dynamic-Website-Content.aspx&amp;amp;;title=Using+MetaWeblog+API+and+Windows+Live+Writer+to+Manage+Dynamic+Website+Content&amp;amp;;top=1" target="_blank" title = "Post http://blogs.ent0.com/blogs/mikebrockey/archive/2007/02/04/Using-MetaWeblog-API-and-Windows-Live-Writer-to-Manage-Dynamic-Website-Content.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ent0.com/aggbug.aspx?PostID=108" width="1" height="1"&gt;</description><category domain="http://blogs.ent0.com/blogs/mikebrockey/archive/tags/Sample+Code/default.aspx">Sample Code</category><category domain="http://blogs.ent0.com/blogs/mikebrockey/archive/tags/WindowsLiveWriter/default.aspx">WindowsLiveWriter</category><category domain="http://blogs.ent0.com/blogs/mikebrockey/archive/tags/MetaWeblogAPI/default.aspx">MetaWeblogAPI</category></item></channel></rss>