<?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>James Crowley</title><link>http://weblogs.asp.net/james_crowley/default.aspx</link><description>Random thoughts from a ASP.NET developer and UK community leader</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>UrlRewriting, .NET 2.0 SP1 and Search Engines</title><link>http://weblogs.asp.net/james_crowley/archive/2008/05/26/urlrewriting-net-2-0-sp1-and-search-engines.aspx</link><pubDate>Mon, 26 May 2008 17:05:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6222525</guid><dc:creator>James Crowley</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=6222525</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2008/05/26/urlrewriting-net-2-0-sp1-and-search-engines.aspx#comments</comments><description>&lt;p&gt;Having been caught out by this issue once again this weekend, I thought I'd better blog about it so I don't scratch my head searching around again for a third time!&lt;/p&gt;&lt;p&gt;If you've been getting some wierd "Cannot use a leading .. to exit above the top directory." exceptions occuring on your site (you *do* log those, don't you?), that you can't reproduce in the browser, stay tuned. The issue crops up with URL Rewriting in .NET 2 SP1 - and the reason I've hit this again is when our production server was upgraded to .NET 3.5... evidentally this installed the service pack as a side-effect. So much for our patching strategy.&lt;/p&gt;&lt;p&gt;Anyway, this triggered a flow of errors for "Cannot use a leading .. to exit above the top directory.", all stemming back to a call to System.Web.Util.UrlPath.ReduceVirtualPath - but apparently only for particular visitors to the site - specifically search engine bots, including Googlebot. The issue occurs, as far as I understand, because .NET is specifically targeting code to particular browsers - in this case, I believe the issue results because it knows the user-agent doesn't support cookies, and is therefore trying to work accordingly.&lt;br&gt;&lt;/p&gt;&lt;p&gt;There are two workarounds out there.&lt;/p&gt;&lt;p&gt;1. In your web.config, add the following:&lt;/p&gt;&lt;p&gt;&amp;lt;authentication mode="Forms"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;forms cookieless="UseCookies" /&amp;gt;&lt;br&gt;&amp;lt;/authentication&amp;gt;&lt;/p&gt;&lt;p&gt;This will bypass the issue entirely - by telling .NET to always use cookies for authentication - but if you require forms authentication to work in a cookie-less scenario, then this won't work. So, on to option number 2&lt;/p&gt;&lt;p&gt;2. Create a .browser file to match the user agents that are causing the issue. &lt;a href="http://todotnet.com/archive/0001/01/01/7472.aspx" mce_href="http://todotnet.com/archive/0001/01/01/7472.aspx"&gt;Check out this article that describes how&lt;/a&gt;.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6222525" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/sp1/default.aspx">sp1</category></item><item><title>Get your tech events featured on MSDN UK and TechNet UK!</title><link>http://weblogs.asp.net/james_crowley/archive/2008/01/26/get-your-tech-events-featured-on-msdn-uk-and-technet-uk.aspx</link><pubDate>Sat, 26 Jan 2008 16:14:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5656218</guid><dc:creator>James Crowley</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=5656218</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2008/01/26/get-your-tech-events-featured-on-msdn-uk-and-technet-uk.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;This announcement is well overdue, but better late than never!&lt;/P&gt;
&lt;P mce_keep="true"&gt;After much hard work by the DPE team at Microsoft in the UK - thanks in particular go out to Clare - we've&amp;nbsp;now integrated the &lt;A class="" href="http://www.developerfusion.co.uk/Events/RSS.aspx?CountryCode=UK" mce_href="http://www.developerfusion.co.uk/Events/RSS.aspx?CountryCode=UK"&gt;Developer Fusion events feed&lt;/A&gt; with the Microsoft UK community pages. This means that anyone who &lt;A class="" href="http://www.developerfusion.co.uk/Members/SubmitReadme.aspx?type=Event" mce_href="http://www.developerfusion.co.uk/Members/SubmitReadme.aspx?type=Event"&gt;submits a Microsoft technology-related&amp;nbsp;event to Developer Fusion&lt;/A&gt; will also automatically appear on the &lt;A class="" href="http://msdn2.microsoft.com/en-gb/aa497440.aspx" mce_href="http://msdn2.microsoft.com/en-gb/aa497440.aspx"&gt;MSDN&lt;/A&gt; and &lt;A class="" href="http://technet.microsoft.com/en-gb/bb291006.aspx" mce_href="http://technet.microsoft.com/en-gb/bb291006.aspx"&gt;TechNet&lt;/A&gt; community pages too - talk about some great free exposure!&lt;/P&gt;
&lt;P mce_keep="true"&gt;Any events on Developer Fusion also get&lt;A class="" href="http://upcoming.yahoo.com/group/3377/" mce_href="http://upcoming.yahoo.com/group/3377/"&gt; automatically posted to Upcoming&lt;/A&gt;.&lt;/P&gt;
&lt;P mce_keep="true"&gt;I'm also working with the larger user groups in the UK to ensure we can automatically pull in their events through the same feed format. If anyone would like more info on this, just get in touch.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5656218" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/Community+News/default.aspx">Community News</category></item><item><title>Gotcha: "The specified metadata path is not valid." with ADO.NET Entities on Vista x64</title><link>http://weblogs.asp.net/james_crowley/archive/2008/01/26/gotcha-quot-the-specified-metadata-path-is-not-valid-quot-with-ado-net-entities-on-vista-x64.aspx</link><pubDate>Sat, 26 Jan 2008 16:09:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:5656175</guid><dc:creator>James Crowley</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=5656175</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2008/01/26/gotcha-quot-the-specified-metadata-path-is-not-valid-quot-with-ado-net-entities-on-vista-x64.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;For those of you foolhardy enough to be running Vista x64 (myself included!), VS 2008, and the latest build of the ADO.NET Entities framework...&amp;nbsp;you may well hit the following error message:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;EM&gt;The specified metadata path is not valid. A valid path must be either an existing directory, an existing file with extension '.csdl', '.ssdl', or '.msl', or a URI that identifies an embedded resource.&lt;/EM&gt; &lt;/P&gt;&lt;SPAN&gt;The catch is that apparently the designers are not supported on 64-bit machines. The workaround is to copy two files from %windir%\Microsoft.NET\Framework64\v3.5 to %windir%\Microsoft.NET\Framework\v3.5:&lt;/SPAN&gt;&lt;SPAN&gt; 
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV align=left&gt;Microsoft.Data.Entity.Build.Tasks.dll&lt;/DIV&gt;
&lt;LI&gt;
&lt;DIV align=left&gt;Microsoft.Data.Entity.targets&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P align=left&gt;then restart Visual Studio&amp;nbsp;and rebuild your solution.&lt;/P&gt;&lt;/SPAN&gt;
&lt;P mce_keep="true"&gt;&lt;SPAN&gt;Thanks to Tommy Williams @ MSFT (&lt;A class="" href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2532468&amp;amp;SiteID=1" mce_href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2532468&amp;amp;SiteID=1"&gt;found on the forums&lt;/A&gt;)&lt;/P&gt;&lt;/SPAN&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5656175" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Shared Printers across Windows Vista and Windows XP</title><link>http://weblogs.asp.net/james_crowley/archive/2007/10/28/shared-printers-across-windows-vista-and-windows-xp.aspx</link><pubDate>Sun, 28 Oct 2007 14:50:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:4801519</guid><dc:creator>James Crowley</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=4801519</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2007/10/28/shared-printers-across-windows-vista-and-windows-xp.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;Since getting a shiny new machine running Vista, I'd been having a bit of grief trying to get it to print to my Canon i6500&amp;nbsp;printer shared through another Windows XP machine. Vista has built-in support for the printer (running locally), but when&amp;nbsp;trying to add it across a network, as the XP machine could not supply the correct 64bit Vista drivers, the&amp;nbsp;Vista machine&amp;nbsp;wasn't too happy - pointing to the correct location of the local device drivers didn't help either!&lt;/P&gt;
&lt;P mce_keep="true"&gt;After sifting through various solutions - this was the one that worked for me.&lt;/P&gt;
&lt;P mce_keep="true"&gt;On the Vista machine,&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;- Choose to add a local printer&lt;BR&gt;- Create a new local port, and set its name so it matches the network share (&lt;A href="file://server/name"&gt;\\server\name&lt;/A&gt;)&lt;BR&gt;- Manually select the appropriate printer driver from the automatically supported set (or select an appropriate vista driver)&lt;/P&gt;
&lt;P mce_keep="true"&gt;This then tricks Vista into thinking we have a local printer - so it can install the correct drivers - that actually redirects to the network printer.&lt;/P&gt;
&lt;P mce_keep="true"&gt;I think this should work in the reverse direction too, if Windows XP is geting upset printing to a device shared through Vista.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Hope this helps someone!&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=4801519" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/XP/default.aspx">XP</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/Vista/default.aspx">Vista</category></item><item><title>Upcoming (Free) UK Developer Events</title><link>http://weblogs.asp.net/james_crowley/archive/2007/10/08/upcoming-uk-developer-events.aspx</link><pubDate>Mon, 08 Oct 2007 08:03:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:4485972</guid><dc:creator>James Crowley</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=4485972</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2007/10/08/upcoming-uk-developer-events.aspx#comments</comments><description>
&lt;p&gt;There's so many great events coming up all around the UK at the moment - and best of all, they're free. If you haven't tried one yet, &lt;a href="http://www.developerfusion.co.uk/events/" mce_href="http://www.developerfusion.co.uk/events/"&gt;check out the UK developer event listings to find one near you&lt;/a&gt;. Here are just a few &lt;/p&gt;
&lt;h3&gt;&lt;a href="http://www.developerfusion.co.uk/show/7088/" mce_href="http://www.developerfusion.co.uk/show/7088/"&gt;db4o: An Embeddable Database Engine for Object-Oriented Environments &lt;/a&gt;&lt;/h3&gt;
&lt;h5&gt;Wednesday, 10 October 2007, 19:00 - 21:00 in &lt;a href="http://www.developerfusion.co.uk/Events/Country/UK/" mce_href="http://www.developerfusion.co.uk/Events/Country/UK/"&gt;Glasgow, United Kingdom&lt;/a&gt;. FREE (&lt;a href="http://www.developerfusion.co.uk/show/5007/" mce_href="http://www.developerfusion.co.uk/show/5007/"&gt;Scottish Developers&lt;/a&gt;)&lt;/h5&gt;
&lt;p&gt;Jim Paterson describes the key features of db4o, and shows how to save objects in the database, use the db4o query mechanisms, control transactions and object activation, refactor databases, replicate data to a relational database and use db4o in a web app. You will also find out about extensive the developer resources provided by the db4o community. &lt;/p&gt;
&lt;h3&gt;&lt;a href="http://www.developerfusion.co.uk/show/7001/" mce_href="http://www.developerfusion.co.uk/show/7001/"&gt;Microsoft® SharePoint® Server 2007 - Capture The Opportunity&lt;/a&gt;&lt;/h3&gt;
&lt;h5&gt;Friday, 12 October 2007, 10:00 - 14:00 in &lt;a href="http://www.developerfusion.co.uk/Events/Country/UK/" mce_href="http://www.developerfusion.co.uk/Events/Country/UK/"&gt;London, United Kingdom&lt;/a&gt;. FREE! (&lt;a href="http://www.developerfusion.co.uk/show/7000/" mce_href="http://www.developerfusion.co.uk/show/7000/"&gt;Content and Code&lt;/a&gt;)&lt;/h5&gt;
&lt;p&gt;Discover the multitude of solutions offered by a Microsoft® SharePoint® Server 2007 platform. Enjoy interactive breakout demonstrations as well as a buffet lunch. Demonstrations will focus on: data capture, enterprise content management, document management, search, forms server as well as business intelligence, dashboards and KPIs. &lt;/p&gt;
&lt;h3&gt;&lt;a href="http://www.developerfusion.co.uk/show/6984/" mce_href="http://www.developerfusion.co.uk/show/6984/"&gt;The Lost World: Win Services&lt;/a&gt;&lt;/h3&gt;
&lt;h5&gt;Monday, 15 October 2007, 19:00 - 21:00 in &lt;a href="http://www.developerfusion.co.uk/Events/Country/UK/" mce_href="http://www.developerfusion.co.uk/Events/Country/UK/"&gt;Birmingham, United Kingdom&lt;/a&gt;. Free to members. Non members can attend 2 meetings FOC. (&lt;a href="http://www.developerfusion.co.uk/show/6119/" mce_href="http://www.developerfusion.co.uk/show/6119/"&gt;NxtGenUG&lt;/a&gt;)&lt;/h5&gt;
&lt;p&gt;Intrepid Explorer Liam Westley takes a trip back in time as he dives into Windows and looks at developing Windows Services. Remember those? Well, in case you hadn't noticed they're all around us in the development world, but hard to see and hard to capture with a debugger! Liam shows us how we can make our lives easier when writing and working with Windows Services including some of the differences between NT and Windows Vista Services. Other gigantic things to see on the night : Pizza-o-sa...&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://www.developerfusion.co.uk/show/7107/" mce_href="http://www.developerfusion.co.uk/show/7107/"&gt;MSDN: What’s new in Visual Studio 2008 and .NET Fx 3.5 for the Web Developer &lt;/a&gt;&lt;/h3&gt;
&lt;h5&gt;Tuesday, 16 October 2007, 18:00 - 21:20 in &lt;a href="http://www.developerfusion.co.uk/Events/Country/UK/" mce_href="http://www.developerfusion.co.uk/Events/Country/UK/"&gt;Edinburgh, United Kingdom&lt;/a&gt;. FREE (&lt;a href="http://www.developerfusion.co.uk/show/5041/" mce_href="http://www.developerfusion.co.uk/show/5041/"&gt;Microsoft&lt;/a&gt;)&lt;/h5&gt;
&lt;p&gt;Come along and find out what’s in store for both the ASP.NET platform and Visual Studio in the upcoming release. As web developers, there’s a lot to get excited about including many features you can take advantage of in your existing projects.&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://www.developerfusion.co.uk/show/7031/"&gt;SQL 2008 Your Data, Any Place Any Time&lt;/a&gt;&lt;/h3&gt;
&lt;h5&gt;Thursday, 18 October 2007, 09:00 - 13:00 in &lt;a href="http://www.developerfusion.co.uk/Events/Country/UK/"&gt;Bradford, United Kingdom&lt;/a&gt;. FREE (&lt;a href="http://www.developerfusion.co.uk/show/5095/"&gt;Black Marble&lt;/a&gt;)&lt;/h5&gt;
&lt;p&gt;Black Marble present a seminar on SQL2008 with an Introduction for
IT Managers. This outlines the change in emphasis from "words and
numbers" to "sights and sounds"&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=4485972" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/winfx/default.aspx">winfx</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/sql+server/default.aspx">sql server</category></item><item><title>Future of Web Apps in London - (plus 20% discount!)</title><link>http://weblogs.asp.net/james_crowley/archive/2007/09/25/future-of-web-apps-in-london-plus-20-discount.aspx</link><pubDate>Tue, 25 Sep 2007 18:52:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:4145217</guid><dc:creator>James Crowley</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=4145217</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2007/09/25/future-of-web-apps-in-london-plus-20-discount.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;&lt;A class="" href="http://www.developerfusion.co.uk/show/7099/" mce_href="http://www.developerfusion.co.uk/show/7099/"&gt;Future of Web Apps&lt;/A&gt; have a run a great set of events in&amp;nbsp;both the US and the UK&amp;nbsp;- and there's one coming up in London on Oct 3-5. Just to give you a taster, there are speakers from&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Digg&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Flickr&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Facebook&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;WordPress&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;FeedBurner&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Yahoo&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Adobe&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Microsoft&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;Not bad eh? &lt;A class="" href="http://www.developerfusion.co.uk/show/7099/" mce_href="http://www.developerfusion.co.uk/show/7099/"&gt;Even better - Developer Fusion has organised a 20% discount off the full ticket price&lt;/A&gt;, which brings the two day conference pass down to less than £200.&amp;nbsp;Give me a shout too if you're going to attend - I'm planning to make it.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=4145217" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/.NET/default.aspx">.NET</category></item><item><title>C#/VB.NET Code Translation tweak</title><link>http://weblogs.asp.net/james_crowley/archive/2007/09/12/c-vb-net-code-translation-tweak.aspx</link><pubDate>Wed, 12 Sep 2007 21:29:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3839966</guid><dc:creator>James Crowley</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=3839966</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2007/09/12/c-vb-net-code-translation-tweak.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;I've been getting a *lot* of feedback recently over the changes we made to the C#/VB.NET &lt;A class="" href="http://labs.developerfusion.co.uk/" mce_href="http://labs.developerfusion.co.uk/"&gt;code translation tools&lt;/A&gt; to try and tidy them up - but unfortunately broke a somewhat crucial ability to copy the code out in IE6! I'm still not sure why IE6 is so unhappy with the CSS and is preventing any sensible selection in the output page&amp;nbsp;(any suggestions welcomed). &lt;/P&gt;
&lt;P mce_keep="true"&gt;However, I've now implemented a "view plain source" and "copy to clipboard" option which should at least get around this for now!&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3839966" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/visual+basic/default.aspx">visual basic</category></item><item><title>Free Silverlight Training</title><link>http://weblogs.asp.net/james_crowley/archive/2007/09/04/free-silverlight-training.aspx</link><pubDate>Tue, 04 Sep 2007 15:00:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:3732372</guid><dc:creator>James Crowley</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=3732372</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2007/09/04/free-silverlight-training.aspx#comments</comments><description>&lt;p&gt;If you've been wanting to get up to speed on Silverlight but haven't had the time yet - then you might be interested in this. Developer Fusion has teamed up with InnerWorkings to offer some &lt;a href="http://www.innerworkings.com/promotions/c786f484-b556-4903-b395-4f1cbd610fd7/developer-fusion-silverlight-promotion" mce_href="http://www.innerworkings.com/promotions/c786f484-b556-4903-b395-4f1cbd610fd7/developer-fusion-silverlight-promotion"&gt;totally free Silverlight training&lt;/a&gt;, to all Developer Fusion visitors. &lt;br&gt;&lt;/p&gt;&lt;p&gt;We're also got, amongst others, a 15% discount on DevelopMentor training, and 10% discount on the source code and hosted version of Gemini (from CounterSoft) - the bug tracking system that the team behind dotnetnuke use. More details are available on our &lt;a href="http://www.developerfusion.co.uk/Members/Benefits.aspx" mce_href="http://www.developerfusion.co.uk/Members/Benefits.aspx"&gt;free member benefits page&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If you have any feedback, or offers of further discounts to our visitors, just get in touch!&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=3732372" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/ajax/default.aspx">ajax</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/silverlight/default.aspx">silverlight</category></item><item><title>Gotcha: HTTP_X_FORWARDED_FOR returns multiple IP addresses</title><link>http://weblogs.asp.net/james_crowley/archive/2007/06/19/gotcha-http-x-forwarded-for-returns-multiple-ip-addresses.aspx</link><pubDate>Tue, 19 Jun 2007 21:00:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:2868581</guid><dc:creator>James Crowley</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=2868581</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2007/06/19/gotcha-http-x-forwarded-for-returns-multiple-ip-addresses.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;I hit a small gotcha this evening. A visitor to Developer Fusion reported that they couldn't gain access to the site at all, because our IP address detection logic was failing. We were checking the "HTTP_X_FORWARDED_FOR" header for an IP address, before falling back to REMOTE_ADDR, turning the IP into a long integer, and doing an IP-to-country lookup in our database.&amp;nbsp;Which seemed safe enough!&lt;/P&gt;
&lt;P mce_keep="true"&gt;As it turns out, HTTP_X_FORWARDED_FOR can sometimes have a comma delimited list of IP addresses - so what we actually needed to be doing was take the last IP address in that list, before doing our conversion to an integer. &lt;/P&gt;
&lt;P mce_keep="true"&gt;Thanks go out to Francois Botha, one of our visitors, for helping me track down this issue!&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2868581" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/asp.net/default.aspx">asp.net</category></item><item><title>C# &lt;-&gt; VB.NET Converters Updated</title><link>http://weblogs.asp.net/james_crowley/archive/2007/06/09/c-lt-gt-vb-net-converters-updated.aspx</link><pubDate>Sat, 09 Jun 2007 14:28:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:2767995</guid><dc:creator>James Crowley</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=2767995</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2007/06/09/c-lt-gt-vb-net-converters-updated.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;We've just updated our free&amp;nbsp;&lt;A href="http://www.developerfusion.co.uk/Utilities/convertcsharptovb.aspx"&gt;C# to VB.NET&lt;/A&gt; and &lt;A href="http://www.developerfusion.co.uk/Utilities/convertvbtocsharp.aspx"&gt;VB.NET to C#&lt;/A&gt; converters on Developer Fusion - they're adapted from the neat little utilities within the&amp;nbsp;free .NET IDE, &lt;A class="" href="http://www.icsharpcode.net/OpenSource/SD/" mce_href="http://www.icsharpcode.net/OpenSource/SD/"&gt;#develop&lt;/A&gt; . They now keep your comments in tact too. Great for when you've found those bits of sample code in the wrong language! If you haven't come across them before, they're well worth a look.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;[Update:&lt;/STRONG&gt; They support generics now too!&lt;STRONG&gt;]&lt;/STRONG&gt;&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2767995" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/VB.NET/default.aspx">VB.NET</category></item><item><title>BT Web21C SDK - Sending SMS, Voice Calls and Location Based Services</title><link>http://weblogs.asp.net/james_crowley/archive/2007/05/22/bt-sdk-sending-sms-voice-calls-and-location-based-services.aspx</link><pubDate>Tue, 22 May 2007 20:43:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:2637294</guid><dc:creator>James Crowley</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=2637294</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2007/05/22/bt-sdk-sending-sms-voice-calls-and-location-based-services.aspx#comments</comments><description>&lt;P&gt;Another interesting side-point from the discussion this morning - Joe Black, director of Emerging Business and Technology at BT pointed me in the direction of their new &lt;A class="" href="http://sdk.bt.com/" mce_href="http://sdk.bt.com/"&gt;Web 21C SDK&lt;/A&gt; - available in .NET, Java, PHP and Python. What this does is exposes a load of functionality allowing you to integrate with their systems - including sending SMS, voice messages, conference calls, and location-based services. The service will ultimately work by purchasing "credits" for use within the system - but you're free to experiment within certain pre-set limits at no charge. &lt;/P&gt;
&lt;P&gt;There's also an interview of &lt;A class="" href="http://channel9.msdn.com/ShowPost.aspx?PostID=291580" mce_href="http://channel9.msdn.com/ShowPost.aspx?PostID=291580"&gt;two of the guys involved up on channel9&lt;/A&gt;, and some &lt;A class="" href="http://treeho.us/phoneymashups/" mce_href="http://treeho.us/phoneymashups/"&gt;demo "mashup"&amp;nbsp;apps using the technology&lt;/A&gt; - including one that will send you details of the nearest restaurants based on your location after&amp;nbsp;you send an SMS. &lt;/P&gt;
&lt;P&gt;Good stuff, and well worth a look!&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2637294" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/Communication/default.aspx">Communication</category></item><item><title>Microsoft Generational Roundtable</title><link>http://weblogs.asp.net/james_crowley/archive/2007/05/22/microsoft-generational-roundtable.aspx</link><pubDate>Tue, 22 May 2007 20:24:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:2637276</guid><dc:creator>James Crowley</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=2637276</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2007/05/22/microsoft-generational-roundtable.aspx#comments</comments><description>&lt;P mce_keep="true"&gt;I took part in an interesting debate today,&amp;nbsp;organised by Microsoft, discussing&amp;nbsp;the latest generation of new graduates, their role in the IT industry - and&amp;nbsp;how they shape it, or are shaped by it. The discussion covered a broad range of issues, and definitely got those brain cells working! Some of the things raised were....&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;How our current education system stimulates (or fails to stimulate) innovation, and whether educational institutions - at all levels - could do more to support this.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Establishing&amp;nbsp;closer ties to business, at university level if not earlier - so students can engage with not only academics, but tap into the experience and knowledge of individuals with years of experience in the industry&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;How can we address&amp;nbsp;the huge gender gap in the IT industry - can&amp;nbsp;leading women within the industry to try to break down some of those preconceptions by engaging with potential students at an early stage?&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Moving towards a increasingly flexi-time, telecommuting business world&amp;nbsp;- will businesses that fail to adapt to accomodate their employees needs struggle to hold on to staff? How will this affect working hours?&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV mce_keep="true"&gt;Looking forward to the next 5-10 years and how technology might further change the way we work.&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;All in all, a very good morning, with some very interesting folks!&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2637276" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/Community+News/default.aspx">Community News</category></item><item><title>Dynamically Generating PDFs in .NET</title><link>http://weblogs.asp.net/james_crowley/archive/2007/03/14/dynamically-generating-pdfs-in-net.aspx</link><pubDate>Wed, 14 Mar 2007 13:12:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:2025824</guid><dc:creator>James Crowley</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=2025824</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2007/03/14/dynamically-generating-pdfs-in-net.aspx#comments</comments><description>&lt;p&gt;It&amp;#39;s perfectly possible to generate a PDF from scratch, using a library such as &lt;a href="http://sourceforge.net/projects/itextsharp/"&gt;iTextSharp&lt;/a&gt;, a port of a free Java PDF library. However, it can be hard work defining all the code you need to generate the layout you&amp;#39;re after, and impossible for someone to tweak the layout without going back to the developer. &lt;/p&gt;&lt;p&gt;One alternative, using the same free library, is instead to design a PDF document in a WYSIWYG environment such as Adobe Designer, and define some dynamic fields within the document. Your code can load this PDF form,&amp;nbsp;set the value of each of the fields, and output a flat PDF. This would enable you to, for instance, have an invoice PDF template defined, set a bunch of fields within the PDF, and output as a flat PDF document - without needing a load of code generating the PDF from scratch. &lt;/p&gt;&lt;p&gt;The code itself is very straightforward. We&amp;#39;re going to send the resulting output to the ASP.NET response stream, so we need to set the content-type and also a content-disposition header so that the result appears as a file download. &lt;/p&gt;&lt;p&gt;&lt;code&gt;Response.ContentType = &amp;quot;application/pdf&amp;quot;;&lt;br /&gt;Response.AddHeader(&amp;quot;Content-disposition&amp;quot;, &amp;quot;attachment; filename=tokens.pdf&amp;quot;);&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Note that we could just as easily be using a file stream, and would therefore replace the above with opening a stream to the appropriate file path. With that out of the way, we use a &lt;code&gt;PdfReader&lt;/code&gt; object to load our existing PDF from the local file system; in this case, from &lt;code&gt;~/assets/form.pdf&lt;/code&gt;. &lt;/p&gt;&lt;p&gt;&lt;code&gt;PdfReader pdfReader = new PdfReader(Request.MapPath(&amp;quot;~/assets/form.pdf&amp;quot;));&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Next we create a &lt;code&gt;PdfStamper&lt;/code&gt; object, which will allow us to modify the form fields defined in the PDF and save the result. We pass it the &lt;code&gt;PdfReader&lt;/code&gt; object representing the PDF file, and a stream we want the result sent to. Finally, we set the &lt;code&gt;FormFlattening&lt;/code&gt; flag so that we get a flat PDF rather than allowing the fields to remain editable. &lt;/p&gt;&lt;p&gt;&lt;code&gt;PdfStamper pdfStamper = new PdfStamper(pdfReader, Response.OutputStream);&lt;br /&gt;pdfStamper.FormFlattening = true; // generate a flat PDF &lt;/code&gt;&lt;/p&gt;&lt;p&gt;We can then set the dynamic fields defined within the PDF form, and close our &lt;code&gt;pdfStamper&lt;/code&gt; object. &lt;/p&gt;&lt;p&gt;&lt;code&gt;AcroFields pdfForm = pdfStamper.AcroFields;&lt;br /&gt;pdfForm.SetField(&amp;quot;InvoiceRef&amp;quot;, &amp;quot;00000&amp;quot;);&lt;br /&gt;pdfForm.SetField(&amp;quot;DeliveryAddress&amp;quot;, &amp;quot;Oxford Street, London&amp;quot;);&lt;br /&gt;pdfForm.SetField(&amp;quot;Email&amp;quot;, &amp;quot;anon@anywhere.com&amp;quot;);&lt;br /&gt;pdfStamper.Close();&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Closing the &lt;code&gt;pdfStamper&lt;/code&gt; object results in the PDF being written to the stream we passed in the constructor, and we&amp;#39;re all done. Simple! &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=2025824" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Search Engine Optimisation (SEO) Checklist</title><link>http://weblogs.asp.net/james_crowley/archive/2007/02/10/search-engine-optimisation-seo-checklist.aspx</link><pubDate>Sat, 10 Feb 2007 13:51:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:1613240</guid><dc:creator>James Crowley</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=1613240</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2007/02/10/search-engine-optimisation-seo-checklist.aspx#comments</comments><description>&lt;p&gt;Search engine optimisation is pretty much part and parcel of creating websites these days. Getting the basics right don&amp;#39;t require a large amount of work, but can make all the difference. Many of these also improve the general usability and accessibility of your site too - so you get&amp;nbsp;three major&amp;nbsp;benefits rolled into one.&lt;/p&gt;&lt;p&gt;The points below&amp;nbsp;are just&amp;nbsp;a&amp;nbsp;few basics I&amp;#39;ve picked up along the way; roughly in order of my&amp;nbsp;own priority,&amp;nbsp;relating specifically to technical changes&amp;nbsp;you can&amp;nbsp;make on your own site, regardless of any incoming links, frequency of page updates,&amp;nbsp;or link building you may do; I&amp;#39;m not claiming this is a comprehensive list by any means - but I&amp;#39;d be very interested to from others as to what they&amp;#39;ve found.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. It&amp;#39;s all about the page title!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If you can&amp;#39;t spare time to do anything else, at least do this! Ensure there is a unique title&amp;nbsp;for each page on your site, and make it as keyword rich, and relevant to the content on the page as you can. If you always include, say, a company name and tagline in the page title, that&amp;#39;s great - but it&amp;#39;s&amp;nbsp;generally a good idea to ensure the portion relevant to the page appears first. Seach engines truncate the titles, so it makes sense to have the most relevant and useful information at the start - and the consistent company name and tagline at the end - for both users scrolling through pages of results, and for the engines themselves.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. Think about the text being used to link to pages&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;We&amp;#39;ve all seen Google &amp;quot;bombing&amp;quot; in action - the most famous being &amp;quot;miserable failure&amp;quot; taking you straight off to the white house. Interestingly, Google has now pulled the plug on that particular quirk. However, the general rule remains the same - if a search engine picks up a link&amp;nbsp;with the text&amp;nbsp;&amp;quot;great .NET products&amp;quot;, even if the page itself doesn&amp;#39;t mention those particular keywords, you can still&amp;nbsp;be listed in those search results.&lt;/p&gt;&lt;p&gt;If you find yourself creating a bunch of hyperlinks along the lines of &amp;quot;Find more here&amp;quot;, &amp;quot;more information&amp;quot;, &amp;quot;click here&amp;quot; - you&amp;#39;re wasting a potential goldmine of keywords, and from an accessibility angle, each distinct URL linked to from a page should have distinct text associated&amp;nbsp;with it anyway&amp;nbsp;.&amp;nbsp;Think twice as to whether you can include some more relevant keywords in the link text, such as &amp;quot;Find more developer jobs here&amp;quot;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Be careful with images. Use CSS Image Replacement&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Everyone&amp;nbsp;by now is (hopefully) always setting the &amp;quot;alt&amp;quot; tag on any images they include on a page. However, search engines still treat these&amp;nbsp;differently to straightforward HTML on the page. Following on from point #2 above,&lt;/p&gt;&lt;p&gt;&amp;lt;a href=&amp;quot;graphics-card.aspx&amp;quot;&amp;gt;Our Graphics Cards&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;is generally weighted much more than&lt;/p&gt;&lt;p&gt;&amp;lt;a href=&amp;quot;graphics-card.aspx&amp;quot;&amp;gt;&amp;lt;img alt=&amp;quot;Our Graphics Cards&amp;quot; src=&amp;quot;graphics.gif&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;If there are&amp;nbsp;images&amp;nbsp;on your site that aren&amp;#39;t content in themselves (such as navigational links and headers), then you should be using a&amp;nbsp;&lt;a href="http://phark.typepad.com/phark/2003/08/accessible_imag.html"&gt;CSS Image replacement technique&lt;/a&gt;. This allows to you do something like this:&lt;/p&gt;&lt;p&gt;&amp;lt;a id=&amp;quot;graphics_cards&amp;quot;&amp;nbsp;href=&amp;quot;graphics-card.aspx&amp;quot;&amp;gt;Our Graphics Cards&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;/* css */&lt;br /&gt;#graphics_cards{&lt;br /&gt;&amp;nbsp;display: block;&lt;br /&gt;&amp;nbsp;text-indent: -5000px;&lt;br /&gt;&amp;nbsp;background: url(graphics.gif);&lt;br /&gt;&amp;nbsp;height: 25px;&lt;br /&gt;&amp;nbsp;width: 25px;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;This technique can (and should!) be applied&amp;nbsp;to headers too, if you&amp;#39;re using images there.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. If you must use flash, put some text in too&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Using something like &lt;a href="http://blog.deconcept.com/swfobject/"&gt;SWFObject&lt;/a&gt; allows you to embed a flash movie, but also include a HTML equivalent that will be indexed by search engines, and viewable by users with flash or javascript disabled.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6. Ensure content is accessible via hyperlink (watch out for AJAX!)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Sounds simple, but if you&amp;#39;re using any sort of form submission (such as a drop down box) or ajax-style scripts&amp;nbsp;to navigate to content on your site, then your content is not going to be indexed unless you take a few further steps.&lt;/p&gt;&lt;p&gt;a) Ensure the content can be accessed directly from a distinct&amp;nbsp;URL too (ideally in conjunction with url rewriting - see point #7). If you&amp;#39;ve got a drop down box listing frequently asked questions, when an item is selected,&amp;nbsp;redirect the user to a unique url for that FAQ entry, rather than just post-ing back and adjusting the content of the page.&lt;/p&gt;&lt;p&gt;b)&amp;nbsp;Ensure you&amp;#39;ve actually got&amp;nbsp;links pointing to these distinct URLs (whether within elsewhere on the site, or externally).&amp;nbsp;You could also use a &lt;a href="http://www.google.com/webmasters/sitemaps/"&gt;Google SiteMap&lt;/a&gt; so that at the very least the search engine knows those pages exist.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5.&amp;nbsp;Page descriptions &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;These are often displayed in search engines if the keywords have&amp;nbsp;matched a page title rather than its content - so they&amp;#39;re worth including even for this - and they still seem to be used for picking up relevant keywords too. Once again, the same points apply as in #1 - don&amp;#39;t just re-use the same standard page description across the entire site.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7. Deep linking&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This is harking back to point #2. If you publish articles, press releases, or the like&amp;nbsp;on your site, and it mentions a product, or&amp;nbsp;another article on the site, then make sure it links to it! This increases the number of contextually relevant links and possible keywords that a search engine might associate your pages with, even if these links are just internal.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;8. Use URL rewriting&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;There are loads of &lt;a href="http://www.google.com/search?q=url+rewriting+asp.net"&gt;URL rewriting techniques&lt;/a&gt; out there. Sensible use of URLs increase the usability of your site, and also allows the search engines to pick up on keywords in your URL too. In order of improvement:&lt;/p&gt;&lt;p&gt;http://www.mycompany.com/page.aspx?id=29&amp;amp;page=ingredients (worst case)&lt;br /&gt;http://www.mycompany.com/product-information.aspx?id=29&amp;amp;page=ingredients&amp;nbsp;(at least give the page a meaningful name!)&lt;br /&gt;http://www.mycompany.com/product-information/29/ingredients/ (search engines still don&amp;#39;t like query strings all that much)&lt;br /&gt;http://www.mycompany.com/products/chips/french-fries/ingredients/&lt;/p&gt;&lt;p&gt;The final example is logical, &amp;quot;hackable&amp;quot; (the user can guess that /products/chips/ will take them back to a&amp;nbsp;sensible page), and keyword rich.&amp;nbsp;Note that the URL of this blog entry follows these lines too!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9. Unknowns...&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Things I&amp;#39;m not 100% sure about.&lt;/p&gt;&lt;p&gt;- Keywords meta tag. I&amp;#39;ve deliberately not mentioned this here, as I&amp;#39;ve seen no sign that these are being used any more.&lt;br /&gt;- Order of content on the page. I always try to ensure that the main body of the content appears as high up the page as possible. This has accessibility benefits (so a screen reader doesn&amp;#39;t read the same set of navigation at the start every time a page loads), but I&amp;#39;m not sure how much weight a search engine places on this order, or how large the page has to be for this to make a difference.&lt;/p&gt;&lt;p&gt;I&amp;#39;d be interested to hear if anyone has suggestions of other must-do&amp;#39;s that I&amp;#39;ve missed.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1613240" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/ajax/default.aspx">ajax</category><category domain="http://weblogs.asp.net/james_crowley/archive/tags/seo/default.aspx">seo</category></item><item><title>Promote your User Group, Events and Job Vacancies (for free)!</title><link>http://weblogs.asp.net/james_crowley/archive/2006/12/09/promote-your-user-group-events-and-job-vacancies-for-free.aspx</link><pubDate>Sat, 09 Dec 2006 12:34:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:1200474</guid><dc:creator>James Crowley</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/james_crowley/rsscomments.aspx?PostID=1200474</wfw:commentRss><comments>http://weblogs.asp.net/james_crowley/archive/2006/12/09/promote-your-user-group-events-and-job-vacancies-for-free.aspx#comments</comments><description>&lt;p&gt;Developer Fusion has gone global! I&amp;#39;ve expanded the listings on Developer Fusion to include information about user groups, events and job vacancies from all over the world, rather than just in the UK. When visiting, the site will automatically display content most relevant to you (from your country!), and I&amp;#39;m going to be working hard to increase our coverage of these.&lt;/p&gt;&lt;p&gt;If you&amp;#39;re involved in a developer-related user group, have an event you&amp;#39;d like to promote, or have a vacancy to fill, wherever you are based in the world,&amp;nbsp;get some free exposure and head over to our &lt;a href="http://www.developerfusion.co.uk/members/submit.aspx"&gt;resource submission page&lt;/a&gt;, and I&amp;#39;ll get it approved for you!&lt;/p&gt;&lt;p&gt;If you have any feedback, feel free to drop me a line.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=1200474" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/james_crowley/archive/tags/Community+News/default.aspx">Community News</category></item></channel></rss>