<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Robert  Robbins  : ASP.NET 2.0</title><link>http://weblogs.asp.net/rrobbins/archive/tags/ASP.NET+2.0/default.aspx</link><description>Tags: ASP.NET 2.0</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>World Wide Web - Internationalization</title><link>http://weblogs.asp.net/rrobbins/archive/2009/03/14/world-wide-web-internationalization.aspx</link><pubDate>Sat, 14 Mar 2009 17:04:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6961578</guid><dc:creator>rrobbins</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rrobbins/rsscomments.aspx?PostID=6961578</wfw:commentRss><comments>http://weblogs.asp.net/rrobbins/archive/2009/03/14/world-wide-web-internationalization.aspx#comments</comments><description>&lt;P&gt;I’m going to Paris France for my vacation this year! I’m very excited about it because I’ve always been a bit of a Francophile. Unfortunately, I don’t speak French so, being a IT professional, I’ve sought a technological solution for the language barrier. I’m not sure that I’ll need to speak any French because I’m going on a guided tour which should reduce my interaction with the locals. &lt;/P&gt;
&lt;P&gt;I’ve already blogged about ASP.NET’s support for internationalization and browser languages on my WordPress blog at: &lt;A href="http://williamsportwebdeveloper.com/cgi/wp/?p=394" target=_blank mce_href="http://williamsportwebdeveloper.com/cgi/wp/?p=394"&gt;ASP.NET 2.0 Culture – Web Site Internationalization&lt;/A&gt;. I also blogged about Elgg’s support for languages at &lt;A href="http://williamsportwebdeveloper.com/cgi/wp/?p=397" target=_blank mce_href="http://williamsportwebdeveloper.com/cgi/wp/?p=397"&gt;Elgg Languages&lt;/A&gt;. I’ve done some additional research since then into how PHP supports internationalization and I looked at how all the browsers implement language settings. &lt;/P&gt;
&lt;P&gt;Firefox and Opera are the best browsers to use if you are working on making a web site international because they are the only browsers that allow you to indicate the browser language in the user agent string. In Firefox:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;To change the browser language type &lt;STRONG&gt;about:config&lt;/STRONG&gt; in the address bar and press Enter. &lt;/LI&gt;
&lt;LI&gt;Enter &lt;STRONG&gt;general.useragent.locale&lt;/STRONG&gt; in the Filter textbox. &lt;/LI&gt;
&lt;LI&gt;Change en-US to fr-FR or change it back to en-US. &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;However, I don’t know of a single web site that attempts to detect the browser language by checking the user agent string which will almost always indicate en-US even when your browser language is not set to that. Even with my browser language set to fr-FR, only Google, Microsoft, and Facebook accommodated me with French text. There seems to be some debate over whether it is a good idea to detect browser language settings. Some developers argue that providing content in the appropriate language based on the browser language is the proper way to handle internationalization while others argue that you need to give visitors a means to explicitly change the language using flags because it has become the expected method. In my opinion, you should use both methods because a bilingual visitor will not want to be stuck with the version of the site that matches his browser language settings.&lt;/P&gt;
&lt;P&gt;&lt;STRIKE&gt;Internet Explorer 8 seems to totally ignore the browser language settings. Even Google appears in English when I set my browser language to &lt;STRONG&gt;fr-FR&lt;/STRONG&gt; in Internet Explorer 8.&lt;/STRIKE&gt; Only Google ignores the browser language settings for Internet Explorer 8. The Safari browser provides no means to change the browser language although you can change the application interface into French by copying the &lt;STRONG&gt;fr.lproj&lt;/STRONG&gt; folder over the &lt;STRONG&gt;en.lproj&lt;/STRONG&gt; folder. Opera does allow you to change the preferred language for web pages and you can change the user interface language to French by downloading the &lt;STRONG&gt;ouw960_fr.lng&lt;/STRONG&gt; file which causes the user agent string to change to: &lt;EM&gt;Opera/9.63 (Windows NT 5.1; U; &lt;STRONG&gt;fr&lt;/STRONG&gt;) Presto/2.1.1.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;The browser language setting is communicated to the web server using the &lt;STRONG&gt;Accept-Language&lt;/STRONG&gt; header in each request. In ASP.NET 2.0 you really don’t need to deal with this because the framework has built-in support for localization using the page directives &lt;EM&gt;UICulture&lt;/EM&gt; and &lt;EM&gt;Culture&lt;/EM&gt;. However, if you want to redirect to a page based on the browser language then you can use the following code in your &lt;STRONG&gt;Global.asax&lt;/STRONG&gt; file:&lt;/P&gt;
&lt;DIV style="BORDER-BOTTOM: gray 1px solid; BORDER-LEFT: gray 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; BACKGROUND-COLOR: #f4f4f4; MARGIN: 20px 0px 10px; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; MAX-HEIGHT: 200px; FONT-SIZE: 8pt; OVERFLOW: auto; BORDER-TOP: gray 1px solid; CURSOR: text; BORDER-RIGHT: gray 1px solid; PADDING-TOP: 4px"&gt;
&lt;DIV style="BORDER-BOTTOM-STYLE: none; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"&gt;&lt;PRE style="BORDER-BOTTOM-STYLE: none; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"&gt;&lt;SPAN style="COLOR: #606060"&gt;   1:&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;Sub&lt;/SPAN&gt; Application_Start(&lt;SPAN style="COLOR: #0000ff"&gt;ByVal&lt;/SPAN&gt; sender &lt;SPAN style="COLOR: #0000ff"&gt;As&lt;/SPAN&gt; [&lt;SPAN style="COLOR: #0000ff"&gt;Object&lt;/SPAN&gt;], &lt;SPAN style="COLOR: #0000ff"&gt;ByVal&lt;/SPAN&gt; e &lt;SPAN style="COLOR: #0000ff"&gt;As&lt;/SPAN&gt; EventArgs)&lt;/PRE&gt;&lt;PRE style="BORDER-BOTTOM-STYLE: none; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"&gt;&lt;SPAN style="COLOR: #606060"&gt;   2:&lt;/SPAN&gt;         &lt;SPAN style="COLOR: #0000ff"&gt;Dim&lt;/SPAN&gt; LanguageArray &lt;SPAN style="COLOR: #0000ff"&gt;As&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;String&lt;/SPAN&gt;() = System.Web.HttpContext.Current.Request.UserLanguages&lt;/PRE&gt;&lt;PRE style="BORDER-BOTTOM-STYLE: none; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"&gt;&lt;SPAN style="COLOR: #606060"&gt;   3:&lt;/SPAN&gt;         &lt;SPAN style="COLOR: #0000ff"&gt;If&lt;/SPAN&gt; LanguageArray(0).Contains(&lt;SPAN style="COLOR: #006080"&gt;"fr"&lt;/SPAN&gt;) &lt;SPAN style="COLOR: #0000ff"&gt;Then&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="BORDER-BOTTOM-STYLE: none; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"&gt;&lt;SPAN style="COLOR: #606060"&gt;   4:&lt;/SPAN&gt;             System.Web.HttpContext.Current.Response.Redirect(&lt;SPAN style="COLOR: #006080"&gt;"bonjour.htm"&lt;/SPAN&gt;)&lt;/PRE&gt;&lt;PRE style="BORDER-BOTTOM-STYLE: none; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: white; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"&gt;&lt;SPAN style="COLOR: #606060"&gt;   5:&lt;/SPAN&gt;         &lt;SPAN style="COLOR: #0000ff"&gt;End&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;If&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="BORDER-BOTTOM-STYLE: none; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-TOP-STYLE: none; COLOR: black; FONT-SIZE: 8pt; BORDER-LEFT-STYLE: none; OVERFLOW: visible; PADDING-TOP: 0px"&gt;&lt;SPAN style="COLOR: #606060"&gt;   6:&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;End&lt;/SPAN&gt; Sub&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;In PHP you can get the &lt;STRONG&gt;Accept-Language&lt;/STRONG&gt; header using the server variable &lt;EM&gt;$_SERVER['HTTP_ACCEPT_LANGUAGE'];&lt;/EM&gt;&amp;nbsp; and then set the locale using&amp;nbsp; &lt;EM&gt;setlocale(LC_ALL, 'fr-FR@euro', 'fr-FR', 'fr-fr');&amp;nbsp; &lt;/EM&gt;which will automatically format the date using French for the month names and weekday names. You then need to set the Time Zone using &lt;EM&gt;putenv("TZ=Europe/Paris"); &lt;/EM&gt;to get a 24 hour time in the Central European Time zone. On a Windows server the &lt;EM&gt;money_format &lt;/EM&gt;function will not be available to you so you’ll need to define your own function for that.&lt;/P&gt;
&lt;P&gt;But I’ve found a more interesting technological solution for the language barrier. I bought a Pocket PC translator from &lt;A href="http://www.ectaco.com/" target=_blank mce_href="http://www.ectaco.com/"&gt;ECTACO&lt;/A&gt;. This device looks like a Pocket PC and it is Microsoft Windows Powered but it is really a highly specialized device with a built-in microphone and large speaker. I’m not sure what operating system it is running but it does not look like Windows Mobile 2003. I think its audio phrasebook may come in handy although it could make an awkward social situation even more awkward. The original SD card did not leave enough room for any additional audio files but I managed to copy everything over to a 2 GB SD card so I could put more MP3s on it.&lt;/P&gt;&lt;EMBED height=364 type=application/x-shockwave-flash pluginspage=http://www.macromedia.com/go/getflashplayer width=448 src=http://static.ning.com/vloggerheads/widgets/video/flvplayer/flvplayer.swf?v=3.7.1%3A9985 mce_src="http://static.ning.com/vloggerheads/widgets/video/flvplayer/flvplayer.swf?v=3.7.1%3A9985" FlashVars="config_url=http%3A%2F%2Fwww.vloggerheads.com%2Fvideo%2Fvideo%2FshowPlayerConfig%3Fid%3D2225835%253AVideo%253A743626%26x%3D841q1SInYOyIVYaZf4irJIobD61qZROA&amp;amp;video_smoothing=on&amp;amp;autoplay=off" scale="noscale" wmode="transparent" allowScriptAccess="always" allowFullScreen="true"&gt; &lt;/EMBED&gt;&lt;BR&gt;&lt;SMALL&gt;&lt;A href="http://www.vloggerheads.com/video/video" mce_href="http://www.vloggerheads.com/video/video"&gt;Find more videos like this on &lt;EM&gt;VloggerHeads&lt;/EM&gt;&lt;/A&gt;&lt;/SMALL&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6961578" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rrobbins/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/rrobbins/archive/tags/ASP.NET+2.0/default.aspx">ASP.NET 2.0</category><category domain="http://weblogs.asp.net/rrobbins/archive/tags/browser+language/default.aspx">browser language</category><category domain="http://weblogs.asp.net/rrobbins/archive/tags/Localization/default.aspx">Localization</category><category domain="http://weblogs.asp.net/rrobbins/archive/tags/Internationalization/default.aspx">Internationalization</category></item><item><title>Custom Web Service Test Page Design</title><link>http://weblogs.asp.net/rrobbins/archive/2008/06/29/custom-web-service-test-page-design.aspx</link><pubDate>Sun, 29 Jun 2008 13:07:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6335164</guid><dc:creator>rrobbins</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rrobbins/rsscomments.aspx?PostID=6335164</wfw:commentRss><comments>http://weblogs.asp.net/rrobbins/archive/2008/06/29/custom-web-service-test-page-design.aspx#comments</comments><description>&lt;P&gt;You can customize the design of a web service's test page with a single line of code in the &lt;STRONG&gt;web.config&lt;/STRONG&gt; file. But like most things in ASP.NET it is not that easy if you actually try it!&lt;/P&gt;
&lt;P&gt;Although you can find instructions on how to specify a custom &lt;STRONG&gt;wsdlHelpGenerator &lt;/STRONG&gt;page it does not seem as if any developer has gone through with it and actually customized the design. They just tell you about the obscure web.config tag and leave it at that. This reflects the typical programmer's indifference to design. Although, to be honest, you really don't need to customize the design of the web service's test page because this is rarely exposed to the public.&lt;/P&gt;
&lt;P&gt;The first thing you should do is copy the default wsdlHelpGenerator template which is buried in the framework's CONFIG folder. On my system I found it at: C:\WINNT\Microsoft.NET\Framework\v2.0.50727\CONFIG\DefaultWsdlHelpGenerator.aspx&lt;/P&gt;
&lt;P&gt;When you have a copy of that file in your web root, edit your web.config file so your ASP.NET site will use your copy of the template page instead of the default template:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: gray 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: gray 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 8pt; PADDING-BOTTOM: 4px; MARGIN: 20px 0px 10px; OVERFLOW: auto; BORDER-LEFT: gray 1px solid; WIDTH: 97.5%; CURSOR: text; MAX-HEIGHT: 200px; LINE-HEIGHT: 12pt; PADDING-TOP: 4px; BORDER-BOTTOM: gray 1px solid; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BACKGROUND-COLOR: #f4f4f4"&gt;
&lt;DIV style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; BORDER-BOTTOM-STYLE: none"&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   1:&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;configuration&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   2:&lt;/SPAN&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;system.web&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   3:&lt;/SPAN&gt;       &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;webServices&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   4:&lt;/SPAN&gt;          &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;wsdlHelpGenerator&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;href&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;="WSHelpPage.aspx"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   5:&lt;/SPAN&gt;       &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;webServices&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   6:&lt;/SPAN&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;system.web&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   7:&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;configuration&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;The DefaultWsdlHelpGenerator.aspx page is coded in C# using a script block marked runat=server so don't try this with a VB.NET project. This is one of those cases where VB.NET developers are really treated like second class citizens of the .NET Framework world because there is no VB.NET version and you would have a tough time converting the code. It is a lot of code.&lt;/P&gt;
&lt;P&gt;However, if you just want to do something simple like change the color of the heading then you can leave the code alone and just edit the CSS. But even this is not that easy. The actual style for the heading appears to be coming from a default local resource. I was unable to figure out exactly where the string is coming from. Maybe some ASP.NET guru can enlighten us on that. &lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: gray 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: gray 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 8pt; PADDING-BOTTOM: 4px; MARGIN: 20px 0px 10px; OVERFLOW: auto; BORDER-LEFT: gray 1px solid; WIDTH: 97.5%; CURSOR: text; MAX-HEIGHT: 200px; LINE-HEIGHT: 12pt; PADDING-TOP: 4px; BORDER-BOTTOM: gray 1px solid; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BACKGROUND-COLOR: #f4f4f4"&gt;
&lt;DIV style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; BORDER-BOTTOM-STYLE: none"&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   1:&lt;/SPAN&gt; &lt;SPAN style="COLOR: #cc6633"&gt;.heading1&lt;/SPAN&gt; { &lt;SPAN style="COLOR: #006080"&gt;&amp;lt;&lt;/SPAN&gt;%#GetLocalizedText("Styleheading1")%&lt;SPAN style="COLOR: #006080"&gt;&amp;gt;&lt;/SPAN&gt; }&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;But a simple solution to this problem is to look at the HTML source in the browser, copy the actual CSS generated, and then edit that for the color. Replace the localized text string with this CSS:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: gray 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: gray 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 8pt; PADDING-BOTTOM: 4px; MARGIN: 20px 0px 10px; OVERFLOW: auto; BORDER-LEFT: gray 1px solid; WIDTH: 97.5%; CURSOR: text; MAX-HEIGHT: 200px; LINE-HEIGHT: 12pt; PADDING-TOP: 4px; BORDER-BOTTOM: gray 1px solid; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BACKGROUND-COLOR: #f4f4f4"&gt;
&lt;DIV style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; BORDER-BOTTOM-STYLE: none"&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   1:&lt;/SPAN&gt; &lt;SPAN style="COLOR: #cc6633"&gt;.heading1&lt;/SPAN&gt; { &lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   2:&lt;/SPAN&gt;     &lt;SPAN style="COLOR: #0000ff"&gt;color&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #006080"&gt;#ffffff;&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   3:&lt;/SPAN&gt;     &lt;SPAN style="COLOR: #0000ff"&gt;font-family&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #006080"&gt;Tahoma;&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   4:&lt;/SPAN&gt;     &lt;SPAN style="COLOR: #0000ff"&gt;font-size&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #006080"&gt;26px;&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   5:&lt;/SPAN&gt;     &lt;SPAN style="COLOR: #0000ff"&gt;font-weight&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #006080"&gt;normal;&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   6:&lt;/SPAN&gt;     &lt;SPAN style="COLOR: #0000ff"&gt;background-color&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #006080"&gt;#A10D0D;&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   7:&lt;/SPAN&gt;     &lt;SPAN style="COLOR: #0000ff"&gt;margin&lt;/SPAN&gt;-&lt;SPAN style="COLOR: #0000ff"&gt;top&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #006080"&gt;0px;&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   8:&lt;/SPAN&gt;     &lt;SPAN style="COLOR: #0000ff"&gt;margin&lt;/SPAN&gt;-&lt;SPAN style="COLOR: #0000ff"&gt;bottom&lt;/SPAN&gt;:     &lt;SPAN style="COLOR: #006080"&gt;0px;&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   9:&lt;/SPAN&gt;     &lt;SPAN style="COLOR: #0000ff"&gt;margin&lt;/SPAN&gt;-&lt;SPAN style="COLOR: #0000ff"&gt;left&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #006080"&gt;-30px;&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;  10:&lt;/SPAN&gt;     &lt;SPAN style="COLOR: #0000ff"&gt;padding&lt;/SPAN&gt;-&lt;SPAN style="COLOR: #0000ff"&gt;top&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #006080"&gt;10px;&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;  11:&lt;/SPAN&gt;     &lt;SPAN style="COLOR: #0000ff"&gt;padding&lt;/SPAN&gt;-&lt;SPAN style="COLOR: #0000ff"&gt;bottom&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #006080"&gt;3px;&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;  12:&lt;/SPAN&gt;     &lt;SPAN style="COLOR: #0000ff"&gt;padding&lt;/SPAN&gt;-&lt;SPAN style="COLOR: #0000ff"&gt;left&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #006080"&gt;15px;&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;  13:&lt;/SPAN&gt;     &lt;SPAN style="COLOR: #0000ff"&gt;width&lt;/SPAN&gt;: &lt;SPAN style="COLOR: #006080"&gt;105%;&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;  14:&lt;/SPAN&gt; }&lt;/PRE&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;  15:&lt;/SPAN&gt;&amp;nbsp; &lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Now let's get really ambitious and apply a Master Page and theme to the web service's test page. You definitely don't want to try this with a VB.NET project because the C# code will cause you a lot of problems. First create a new content page with your selected master page. Copy all the HTML in the DefaultWsdlHelpGenerator.aspx page between &amp;lt;&lt;STRONG&gt;div id="content"&amp;gt;&lt;/STRONG&gt; and the last &lt;STRONG&gt;&amp;lt;/span&amp;gt;&lt;/STRONG&gt; into the appropriate ContentPlaceHolder. Add the missing closing &lt;STRONG&gt;&amp;lt;/div&amp;gt;&lt;/STRONG&gt;. Add every using directive from the DefaultWsdlHelpGenerator.aspx file to the content page's code behind file &lt;STRONG&gt;and&lt;/STRONG&gt; the content page itself. Copy all the C# code from the script block into the code file. Change the access modifier of every method and property in the code to public. I was lazy and made everything in sight public. You can take the time to figure out which properties really need to be public if you like. The title of the content page is a bit tricky but it can be specified using single value data binding:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: gray 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: gray 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 8pt; PADDING-BOTTOM: 4px; MARGIN: 20px 0px 10px; OVERFLOW: auto; BORDER-LEFT: gray 1px solid; WIDTH: 97.5%; CURSOR: text; MAX-HEIGHT: 200px; LINE-HEIGHT: 12pt; PADDING-TOP: 4px; BORDER-BOTTOM: gray 1px solid; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BACKGROUND-COLOR: #f4f4f4"&gt;
&lt;DIV style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; BORDER-BOTTOM-STYLE: none"&gt;&lt;PRE style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 8pt; PADDING-BOTTOM: 0px; MARGIN: 0em; OVERFLOW: visible; WIDTH: 100%; COLOR: black; BORDER-TOP-STYLE: none; LINE-HEIGHT: 12pt; PADDING-TOP: 0px; FONT-FAMILY: consolas, 'Courier New', courier, monospace; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: white; BORDER-BOTTOM-STYLE: none"&gt;&lt;SPAN style="COLOR: #606060"&gt;   1:&lt;/SPAN&gt; Title='&amp;lt;%#ServiceName + &lt;SPAN style="COLOR: #006080"&gt;" "&lt;/SPAN&gt; + GetLocalizedText(&lt;SPAN style="COLOR: #006080"&gt;"WebService"&lt;/SPAN&gt;)%&amp;gt;' &lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;As an example of how beautiful you can make your web service test page, I've used the Commerce template from the &lt;A href="http://msdn.microsoft.com/en-us/asp.net/aa336613.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/asp.net/aa336613.aspx"&gt;ASP.NET Master Pages Template Set&lt;/A&gt; to apply a really fancy design to my file downloader web service's test page. Click the image to see the larger image.&lt;/P&gt;
&lt;P&gt;&lt;A title="Click for larger image" href="http://img258.imageshack.us/img258/2802/aspnetwebservicemasterpzy7.jpg" target=_blank mce_href="http://img258.imageshack.us/img258/2802/aspnetwebservicemasterpzy7.jpg"&gt;&lt;IMG height=209 src="http://img258.imageshack.us/img258/2802/aspnetwebservicemasterpzy7.jpg" width=400 mce_src="http://img258.imageshack.us/img258/2802/aspnetwebservicemasterpzy7.jpg"&gt;&lt;/A&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6335164" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rrobbins/archive/tags/CSS/default.aspx">CSS</category><category domain="http://weblogs.asp.net/rrobbins/archive/tags/Design+Templates/default.aspx">Design Templates</category><category domain="http://weblogs.asp.net/rrobbins/archive/tags/Web+Services/default.aspx">Web Services</category><category domain="http://weblogs.asp.net/rrobbins/archive/tags/ASP.NET+2.0/default.aspx">ASP.NET 2.0</category></item><item><title>What Are You Working On?</title><link>http://weblogs.asp.net/rrobbins/archive/2008/05/14/what-are-you-working-on.aspx</link><pubDate>Wed, 14 May 2008 17:01:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6189180</guid><dc:creator>rrobbins</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/rrobbins/rsscomments.aspx?PostID=6189180</wfw:commentRss><comments>http://weblogs.asp.net/rrobbins/archive/2008/05/14/what-are-you-working-on.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;I've been very busy so instead of blogging about one specific thing I have a lot of minor stuff to report. &lt;/P&gt;
&lt;P mce_keep="true"&gt;I've now read several books on ASP.NET 2.0 so I've abandoned ASP.NET 1.1 except for Storefront 6.0 customizations. I converted one large ASP.NET 1.1 project to ASP.NET 2.0 and I'm converting a classic ASP site to ASP.NET 2.0 (it is going very slow). This will help to keep me focused on ASP.NET 2.0. I can't get into ASP.NET 3.5 because we have not moved to Visual Studio 2008 at work&amp;nbsp;although I do have Visual Web Developer 2008 Express. I'm also securing a classic ASP site by converting its data access to use stored procedures (also going very slow).&lt;/P&gt;
&lt;P mce_keep="true"&gt;A number of small side projects would probably be of more interest. I noticed that none of my &lt;A class="" href="http://www.williamsportwebdeveloper.com/cgi/wp/index.php" mce_href="http://www.williamsportwebdeveloper.com/cgi/wp/index.php"&gt;WordPress blog posts&lt;/A&gt; were being picked up by &lt;A class="" href="http://blogsearch.google.com/" mce_href="http://blogsearch.google.com/"&gt;Google Blog Search&lt;/A&gt;&amp;nbsp;but they have a &lt;A href="http://www.google.com/help/blogsearch/pinging_API.html"&gt;Google Blog Search Pinging Service API&lt;/A&gt;&amp;nbsp;so I decided to write a REST client for that in ASP.NET 2.0. This turned out very well and I managed to get my blog posts listed in that search engine. This should have been unnecessary because I added the Google Blog Search to my WordPress Update Services to send the ping but apparently that isn't effective. Maybe my hosting company blocks outgoing PHP web requests???&amp;nbsp; I cannot get blog trackbacks to work either.&lt;/P&gt;
&lt;P mce_keep="true"&gt;I'm getting started on using the &lt;A class="" href="http://groups.google.com/group/seesmic-api" mce_href="http://groups.google.com/group/seesmic-api"&gt;Seesmic API&lt;/A&gt;. &lt;A class="" href="http://www.seesmic.com/" mce_href="http://www.seesmic.com"&gt;Seesmic&lt;/A&gt; is an interesting web site for conducting conversations via video responses although it is now also being used to leave video comments on text blogs. Today I added a page to their Google Group on &lt;A class="" href="http://groups.google.com/group/seesmic-api/web/asp-net-2-0---seesmic-api-authentication" mce_href="http://groups.google.com/group/seesmic-api/web/asp-net-2-0---seesmic-api-authentication"&gt;ASP.NET 2.0 - Seesmic API Authentication&lt;/A&gt;. This took me several days to write because you need to create a MD5 hash and there was a JSON response to deal with. I experimented with the totally undocumented &lt;A class="" href="http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.deserializeobject.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.deserializeobject.aspx"&gt;JavaScriptSerializer.DeserializeObject&lt;/A&gt; method. According to MSDN, this &lt;EM&gt;converts the specified JSON string to an object graph&lt;/EM&gt;. However, there is no sample code and I have no clue as to how to use it. Based on my experimentation it seems to create nested dictionary objects and KeyValuePair objects. &lt;/P&gt;
&lt;P mce_keep="true"&gt;I read about &lt;A class="" href="http://subsonicproject.com/" mce_href="http://subsonicproject.com/"&gt;SubSonic&lt;/A&gt; in the book &lt;A class="" href="http://www.amazon.com/ASP-NET-2-0-Anthology-Essential-Tricks/" mce_href="http://www.amazon.com/ASP-NET-2-0-Anthology-Essential-Tricks/"&gt;The ASP.NET 2.0 Anthology&lt;/A&gt;. I like how it creates the CRUD part of a site for you because that has always been a tedious chore. Database table management is usually a back end feature relegated to the admin directory so it doesn't have to be anything fancy. However SubSonic scaffolding was giving me some strange captions based on my table names. SubSonic is open source software so I was able to add a property to allow me to set the &lt;A class="" href="http://forums.subsonicproject.com/forums/t/3210.aspx" mce_href="http://forums.subsonicproject.com/forums/t/3210.aspx"&gt;Scaffold Caption&lt;/A&gt;. While poking around the source code I found a treasure trove of useful functions in the Sugar directory. You should definitely get yourself some sugar. &lt;/P&gt;
&lt;P mce_keep="true"&gt;Another major side project of mine was &lt;A class="" href="http://www.williamsportwebdeveloper.com/YouComment.aspx" mce_href="http://www.williamsportwebdeveloper.com/YouComment.aspx "&gt;YouComment&lt;/A&gt;, an experiment in improving the experience of reading comments left on YouTube videos. This continues my focus on the social networking aspects of the site. There were two major technical challenges in this project. First I had to reorganize the XML because the nodes where not nested in such a way as to map comment replies&amp;nbsp;to nested unordered lists.&amp;nbsp;I also needed a hash table to reduce the number of web requests made to retrieve user account information. Unfortunately, this page cannot handle videos with hundreds of comments. But then I have a lot of problems viewing comments on YouTube because it kills my browser to load hundreds of comments. I think I need to create a new version that just&amp;nbsp;displays your comment and its replies. The YouTube community has been complaining for a long time that it would be easier if the comment email notification actually included the comment so you don't need to visit the site to read it&amp;nbsp;but YouTube has refused to make that improvement.&lt;/P&gt;
&lt;P mce_keep="true"&gt;I'm sorry to say that AIR applications appear to be getting some real traction now. I'm already using three AIR applications that are very useful; Twirl, AlertThingy, and &lt;A class="" href="http://freshairapps.com/showcase/app/klok_personal_time_tracking_made_easy/" mce_href="http://freshairapps.com/showcase/app/klok_personal_time_tracking_made_easy/"&gt;Klok&lt;/A&gt;. Klok is a personal time tracking application. It is great for timing your activity on a project. I think Twirl was bought by Seesmic and bloggers are crazy about AlertThingy. I think I should&amp;nbsp;be learning how to create AIR applications.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6189180" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/rrobbins/archive/tags/JSON/default.aspx">JSON</category><category domain="http://weblogs.asp.net/rrobbins/archive/tags/Ping+Rest+Client/default.aspx">Ping Rest Client</category><category domain="http://weblogs.asp.net/rrobbins/archive/tags/ASP.NET+2.0/default.aspx">ASP.NET 2.0</category><category domain="http://weblogs.asp.net/rrobbins/archive/tags/SubSonic/default.aspx">SubSonic</category><category domain="http://weblogs.asp.net/rrobbins/archive/tags/Seesmic+API/default.aspx">Seesmic API</category></item></channel></rss>