<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_想想</title><subtitle type="text">女人一定要有勇气，无论是对爱情也好，对生活也好。如果什么事总是畏首畏尾，那么人生就白白流过了.</subtitle><id>http://feed.cnblogs.com/blog/u/17276/rss</id><updated>2010-05-13T09:04:47Z</updated><author><name>想想</name><uri>http://www.cnblogs.com/xiangxiang/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xiangxiang/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/17276/rss"/><entry><id>http://www.cnblogs.com/xiangxiang/archive/2010/05/13/1734716.html</id><title type="text">通过 ASP.NET 4.0、Visual Studio 2010 和 IIS7 实现的搜索引擎优化</title><summary type="text">Scott Allen 下载示例代码 任何拥有公共网站的人都知道，在吸引网站访问者方面，搜索引擎具有重要的作用。 要让搜索引擎发现并在其查询结果中排名靠前，这很重要。 较高的排名可以吸引更多访问者，从而带来更多付费客户和更高的广告收入。 搜索引擎优化 (SEO) 是网站优化做法，目的是在搜索结果中获得更高排名。 在本文中，我们将讨论在使用最新的 Microsoft Web 技术时可以应用的 SEO...</summary><published>2010-05-13T09:05:00Z</published><updated>2010-05-13T09:05:00Z</updated><author><name>想想</name><uri>http://www.cnblogs.com/xiangxiang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xiangxiang/archive/2010/05/13/1734716.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xiangxiang/archive/2010/05/13/1734716.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl01" onclick="javascript:Track('ctl00_MTContentSelector1_mainContentContainer_ctl00|ctl00_MTContentSelector1_mainContentContainer_ctl01',this);" href="http://msdn.microsoft.com/zh-cn/magazine/dd365190.aspx" target="_blank"&gt;&lt;span  id="xn3_81e49fbb69f81afcfd67f8bb2ec6cd57"&gt;Scott Allen&lt;/span&gt;&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl02" onclick="javascript:Track('ctl00_MTContentSelector1_mainContentContainer_ctl00|ctl00_MTContentSelector1_mainContentContainer_ctl02',this);" href="http://code.msdn.microsoft.com/mag200909ExtremeASPN" target="_blank"&gt;&lt;span  id="xn4_d1781541b8cdaac5f20c04c68395ce9f"&gt;下载示例代码&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn5_6b222a826ea5e8a1cdcad7ba41fb2b0c"&gt;任何拥有公共网站的人都知道，在吸引网站访问者方面，搜索引擎具有重要的作用。&lt;/span&gt; &lt;span  id="xn6_004a4819a075e2af571ebcac5c01b4cf"&gt;要让搜索引擎发现并在其查询结果中排名靠前，这很重要。&lt;/span&gt; &lt;span  id="xn7_d79fc2155a6ca376a5120865e0bf58bf"&gt;较高的排名可以吸引更多访问者，从而带来更多付费客户和更高的广告收入。&lt;/span&gt; &lt;span  id="xn8_e73336065f8cdd13b626aa13650257bc"&gt;搜索引擎优化 (SEO) 是网站优化做法，目的是在搜索结果中获得更高排名。&lt;/span&gt; &lt;span  id="xn9_59f1d2436a034b8c9cebc12288cd4fa9"&gt;在本文中，我们将讨论在使用最新的 Microsoft Web 技术时可以应用的 SEO 做法。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span  id="xn10_0cf60f2756d8a53704425409b2fa373e"&gt;SEO 基础&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn11_0e22e49fa72ae20e3c82a068b56397c0"&gt;在搜索引擎计算网站相对排名时，有很多因素起作用，有些比较重要的因素并不受您直接控制。&lt;/span&gt; &lt;span  id="xn12_399efd3ca50a7a133f6feab9657f2bd3"&gt;例如，我们知道搜索引擎会查看您网站的传入链接。&lt;/span&gt; &lt;span  id="xn13_137f7282b185707e48ea0254e2801d7c"&gt;传入链接是外部域上指向您的域的超链接。&lt;/span&gt; &lt;span  id="xn14_fcf7196ead79483723343ff00c0aa837"&gt;当搜索引擎发现很多传入链接指向某一网站时，它会认为该网站有有趣或重要的内容，并相应地进行排名。&lt;/span&gt; &lt;span  id="xn15_055b8cafa5709fff074b58c5fd4140eb"&gt;SEO 社区使用&amp;#8220;链接汁&amp;#8221;和&amp;#8220;友情链接&amp;#8221;这类技术术语描述这一现象。网站拥有的&amp;#8220;链接汁&amp;#8221;越多，在搜索结果中的排名就越高。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn16_cd60d0f286348cb75b4e818c0cf14eca"&gt;如果您的网站很吸引人，其他网站自然会开始链接您的网站。&lt;/span&gt; &lt;span  id="xn17_ff49d7f3c00160e7cd18c44d4ad7f84a"&gt;Visual Studio 不提供&amp;#8220;让网站更吸引人&amp;#8221;这种功能，因此，您最终得靠自己的努力为网站增添值得链接的内容。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn18_3f5e118e70e22a84746d089360b67c62"&gt;准备好优质的内容后，您将需要确保搜索引擎能够搜索到并处理这些内容。&lt;/span&gt; &lt;span  id="xn19_ac5a80b2e51fb822fb199b4dde35165a"&gt;我们不了解 Bing.com 和 Google 等搜索引擎使用的确切算法。&lt;/span&gt; &lt;span  id="xn20_c82eae3de0ac34336e99e96b1b0b3591"&gt;但大多数搜索引擎都公布了设计和内容指导，您可以遵照这些指导提升排名。&lt;/span&gt; &lt;span  id="xn21_d39f5688e27ee81e37a36313f9ac21e4"&gt;Internet 社区还汇集了大量通过反复尝试所获得的知识。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://i.msdn.microsoft.com/ee405899.figure1(en-us).gif" /&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn22_5c7c3f53d47e9309e930ac2ad2d7bc9a"&gt;关键是：站在搜索引擎的角度思考问题。&lt;/span&gt; &lt;span  id="xn23_fba685bc9d5826476490d1520017caa5"&gt;搜索引擎不执行脚本，也不识别网站图像中的形状。&lt;/span&gt; &lt;span  id="xn24_192fbbabf7b0581041cb2e0e6eb4b95e"&gt;它们系统地跟踪链接，从而进行分析、编入索引并对发现的 HTML 内容排名。&lt;/span&gt; &lt;span  id="xn25_49096cb7e3b9ec6133a35184da6c487b"&gt;站在搜索引擎的角度思考问题，您就会将注意力集中在 HTML 上。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span  id="xn26_9c6a22bed334bff5f8eaca448912353c"&gt;快速有效的 HTML&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn27_d168075f717fba808830b6a136172972"&gt;Visual Studio 在桌面和 Web 方面都有很长的 WYSIWYG 开发历史。&lt;/span&gt; &lt;span  id="xn28_5cef1186893bd661dce9d3710d3c470d"&gt;使用 Web 窗体设计器可以在设计图面上拖放服务器控件，并在&amp;#8220;属性&amp;#8221;窗口中为控件设置值。&lt;/span&gt; &lt;span  id="xn29_8866e82b99471fb2706c7a06a402eb42"&gt;甚至不需要查看 HTML，您就可以快速创建网页。&lt;/span&gt; &lt;span  id="xn30_bc016884876badb04e3439466d19a8de"&gt;但是，如果关注 HTML，您将需要在&amp;#8220;源视图&amp;#8221;窗口中工作。&lt;/span&gt; &lt;span  id="xn31_6e5c3fa5399c8c47eafd1a2d507d6201"&gt;令人高兴的是，在 Visual Studio 2010 中，您可以在源视图中工作而不影响速度和准确性。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn32_25098007c7634ca7389d2e6b10ce8e34"&gt;Visual Studio 2010 将提供大量 HTML IntelliSense 代码段，使用这些代码段，在创建常见 HTML 标记和服务器端控件时，可以尽量减少击键次数。&lt;/span&gt; &lt;span  id="xn33_fbaef755c7a0c5a37a8a6df92f6f4f2e"&gt;例如，在 .aspx 文件的源视图中，键入 img 然后按 Tab 键，就可以生成&lt;strong&gt;图 1&lt;/strong&gt; 中所示的标记。&lt;/span&gt; &lt;span  id="xn34_7cc000fe01b518ab3cfba42f77117457"&gt;只需四次击键就实现了需要键入 20 多个字符才能实现的效果！&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn35_28130baf2e9ea8dbbe1232c457e7679c"&gt;请注意&lt;strong&gt;图 1&lt;/strong&gt; 中编辑器突出显示 src 和 alt 值的方式。&lt;/span&gt; &lt;span  id="xn36_6206cba544dae0cbc5ae8ea849311fa7"&gt;使用代码段时，您可以通过 Tab 键在突出显示的区域间切换，开始键入即可覆盖其中的值。&lt;/span&gt; &lt;span  id="xn37_26fe0485ef1b40029f7bea50ed025791"&gt;这项功能也可提升效率，减少了导航到适当插入点手动删除现有值所需的工作量。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn38_069c6975bea4f25a3fa151b5b54ea4e3"&gt;在 Visual Studio 2010 中，ASP.NET Web 窗体和 ASP.NET MVC 项目都提供 HTML 代码段，可以用来创建从 ActionLink 到 XHTML DOCTYPE 声明的任何内容。&lt;/span&gt; &lt;span  id="xn39_8364bff6a3e0f19c9b7b304df4346163"&gt;这些代码段可进行扩展、可进行自定义，它们基于自 Visual Studio 2005 就提供的代码段引擎。&lt;/span&gt; &lt;span  id="xn40_6783c0b2639a1cebc19d49756627bbf2"&gt;有关代码段的更多详细信息，请参见 Lorenzo Minore 的 MSDN 文章 (&lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl04" onclick="javascript:Track('ctl00_MTContentSelector1_mainContentContainer_tgt40|ctl00_MTContentSelector1_mainContentContainer_ctl04',this);" href="http://msdn.microsoft.com/zh-cn/magazine/cc188694.aspx" target="_blank"&gt;msdn.microsoft.com/en-us/magazine/cc188694.aspx&lt;/a&gt;).&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://i.msdn.microsoft.com/ee405899.figure2(en-us).gif" /&gt; &lt;br /&gt;&lt;span  id="xn41_151906b327b4c1361fbae15c44c7018c"&gt;图 2 &lt;strong&gt;验证设置&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span  id="xn42_a617908b172c473cb8e8cda059e55bf0"&gt;验证&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn43_e0b279be6960957067dd1f53832efebd"&gt;如果希望搜索引擎将您的站点编入索引，创建有效的 HTML 非常关键。&lt;/span&gt; &lt;span  id="xn44_3366297192d7e9ba68927e16fb161573"&gt;Web 浏览器要求不严格，会尽其所能显示 HTML 格式不正确的页面，但是，如果搜索引擎发现无效的 HTML，会跳过重要内容或放弃整个页面。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn45_e0298eab9fa6bc6f30b44b6a149261f2"&gt;由于有不同版本的 HTML 规范，应用程序实现的每个页面都应包含 DOCTYPE 元素。&lt;/span&gt; &lt;span  id="xn46_9752e2367824239894b4e23f714c1f1b"&gt;DOCTYPE 元素指定页面所使用的 HTML 版本。&lt;/span&gt; &lt;span  id="xn47_9d0214dead53fa811db2e9fcd7b723bc"&gt;Web 浏览器、搜索引擎和其他工具将检查 DOCTYPE 以确定如何解释标记。&lt;/span&gt; &lt;span  id="xn48_ca25b78e10cefe0522cfd20023edef62"&gt;创建新的 Web 窗体页和母版页时，Visual Studio 会在适当的位置放置 DOCTYPE。&lt;/span&gt; &lt;span  id="xn49_48c772faa013b699d1527955fffabdd5"&gt;默认的 DOCTPYE（如下面的代码段所示）指定页面遵守 XHTML 1.0 规范：&lt;/span&gt; &lt;/p&gt;&lt;span id="ctl00_MTContentSelector1_mainContentContainer_ctl06"&gt;&#xD;
&lt;div  id="ctl00_MTContentSelector1_mainContentContainer_ctl06_"&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a  title="复制代码" href="http://www.cnblogs.com/xiangxiang/admin/javascript:CopyCode('ctl00_MTContentSelector1_mainContentContainer_ctl06_code');" target="_blank"&gt;&#xD;
&lt;div  style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; width: auto; height: 9px; border-right-width: 0px" align="center"&gt;&lt;/div&gt;复制代码 &lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div dir="ltr" style="background-color: #ddd"&gt;&lt;pre  id="ctl00_MTContentSelector1_mainContentContainer_ctl06_code" space="preserve"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;span  id="xn50_895797611f82b18aaa2f7574e0bfeb75"&gt;尽管不需要知道 HTML 规范间的细微差别，但您必须知道页面是否符合某一特定 DOCTYPE。&lt;/span&gt; &lt;span  id="xn51_5946e5e830a2cdc03eb6de683c1c168f"&gt;Visual Studio 自 2005 版起，就提供 HTML 验证功能，默认情况下，验证功能为启用状态。&lt;/span&gt; &lt;span  id="xn52_c22e06e92373f6f9913bfce061aae6bb"&gt;您可以控制验证设置和验证目标类型，方法是导航到&amp;#8220;工具&amp;#8221;|&amp;#8220;选项&amp;#8221;|&amp;#8220;文本编辑器&amp;#8221;|&amp;#8220;HTML&amp;#8221;|&amp;#8220;验证设置&amp;#8221;（如&lt;strong&gt;图 2&lt;/strong&gt; 所示）。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn53_5710cf1ff748253e058413666a54530d"&gt;&amp;#8220;作为警告&amp;#8221;设置表示 HTML 验证问题不会导致停止生成，但将在 Visual Studio 的&amp;#8220;错误&amp;#8221;窗口中显示为警告。&lt;/span&gt; &lt;span  id="xn54_6ec2839cddaa8f19c679f958272abb76"&gt;在 Web 窗体的源视图中，文本编辑器使用波浪线提醒您注意 HTML 验证错误。&lt;/span&gt; &lt;span  id="xn55_e3ad8bfe795eec29c1d9d56d156e39d9"&gt;您可以将鼠标悬停在元素上查看确切的错误消息，如&lt;strong&gt;图 3&lt;/strong&gt; 所示。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://i.msdn.microsoft.com/ee405899.figure3(en-us).gif" /&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span  id="xn56_d9e7b5d54aae8282b9ec802a96706aad"&gt;描述性 HTML&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn57_d01427b5eb554378e7eb10b9fc70b783"&gt;&lt;strong&gt;图 3&lt;/strong&gt; 中的 img 标记很好地说明了为何需要像搜索引擎一样思考。&lt;/span&gt; &lt;span  id="xn58_4f885c1a17c4b49d9b3ee1b5a13d8b0b"&gt;如前所述，搜索引擎不查看或解释图像中的形状和字词，但我们可以使用 alt 属性向搜索引擎提供一些关于图形内容的附加信息。&lt;/span&gt; &lt;span  id="xn59_504ee09b9572780d5737329e66135719"&gt;如果图像是公司徽标，则 alt 文本可以是&amp;#8220;公司徽标&amp;#8221;，但在徽标的 alt 文本中加上公司名称会更好。&lt;/span&gt; &lt;span  id="xn60_12cf4c9fdfd4d563f8571c53111fbb2c"&gt;搜索引擎将 alt 文本用作另一个线索来了解页面的主题和实际内容。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn61_02e8e8b78b033c0176fcdb59d2850563"&gt;搜索引擎始终在查找这类线索，对于搜索引擎来说，某些线索比其他线索更为重要。&lt;/span&gt; &lt;span  id="xn62_5b73d07399d7e75b692ded382f3da5cd"&gt;例如，我们通常使用标头标记（如 h1 标记）在页面中突出某些内容。&lt;/span&gt; &lt;span  id="xn63_09ca291464692430e288d27efa8e89c1"&gt;通常，搜索引擎对 h1 标记中的关键字会给予比普通段落中的该关键字更多的权重。&lt;/span&gt; &lt;span  id="xn64_31c7a889721f91d66850b85997ab29aa"&gt;您应确保 h1 内容是描述性的，并使用与页面主题相关的关键字。&lt;/span&gt; &lt;span  id="xn65_2f5f43724189045101f9877c0ed11e12"&gt;SEO 工作的一种最佳做法是始终在每个页面中包含至少一个 H1 标记。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn66_e0b561d0cb07e79c1aed5af0e003c171"&gt;回顾一下我为本文选择的标题，就会发现它们包含&amp;#8220;有效的 HTML&amp;#8221;、&amp;#8220;SEO 基础&amp;#8221;等词语。&lt;/span&gt; &lt;span  id="xn67_1aecaf779029c3de38f5511d1cd8c17d"&gt;这些都是一些描述性词语，可以很好地为读者和搜索引擎提供文章内容信息。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span  id="xn68_952d4071b2bae991c451b59be370239e"&gt;描述性标题和元数据&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn69_5b80b527c60b3c2de1faa5270a51e244"&gt;另一个需要使用描述性关键字的区域在 head 标记内。&lt;/span&gt; &lt;span  id="xn70_4cbb262859d3443690dacf051c2ca85a"&gt;关联代码下载中某一页面的 head 部分如下所示：&lt;/span&gt; &lt;/p&gt;&lt;span id="ctl00_MTContentSelector1_mainContentContainer_ctl08"&gt;&#xD;
&lt;div  id="ctl00_MTContentSelector1_mainContentContainer_ctl08_"&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a  title="复制代码" href="http://www.cnblogs.com/xiangxiang/admin/javascript:CopyCode('ctl00_MTContentSelector1_mainContentContainer_ctl08_code');" target="_blank"&gt;&#xD;
&lt;div  style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; width: auto; height: 9px; border-right-width: 0px" align="center"&gt;&lt;/div&gt;复制代码 &lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div dir="ltr" style="background-color: #ddd"&gt;&lt;pre  id="ctl00_MTContentSelector1_mainContentContainer_ctl08_code" space="preserve"&gt;&amp;lt;head runat="server"&amp;gt;&#xD;
&amp;lt;title&amp;gt;Programming meta tags in ASP.NET 4.0&amp;lt;/title&amp;gt;&#xD;
&amp;lt;meta name="keywords" content="ASP.NET, ASP.NET 4.0, SEO, meta" /&amp;gt;&#xD;
&amp;lt;meta name="description" content=&#xD;
"How to use Page.MetaKeywords and Page.MetaDescription in ASP.NET" /&amp;gt;&#xD;
&amp;lt;/head&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;span  id="xn71_b8ee7cd5167ec1a31c899a4982046f5b"&gt;页面 title 标记中的词具有很高的权重，因此需要选择适当的标题。&lt;/span&gt; &lt;span  id="xn72_260812733e59d7d6e430d289373847a3"&gt;head 标记还可以包含 meta 标记。&lt;/span&gt; &lt;span  id="xn73_308cd1900e5bada1327ffe8438da9c9d"&gt;要进行 SEO 工作，可以使用两个 meta 标记 &amp;#8212; 一个用于设置页面的关联关键字，一个用于设置页面的描述。&lt;/span&gt; &lt;span  id="xn74_1a845ce6585d45c198b89f4ba64a4bbf"&gt;访问者一般看不到这些 meta 信息，但某些搜索引擎会在搜索结果中显示页面的 meta 描述。&lt;/span&gt; &lt;span  id="xn75_c0ee3671e5d3c5b7d3d299d1ed53ee76"&gt;通过为搜索引擎提供重要字词与页面关联，meta 关键字也可以宣传页面的实际内容。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn76_a6f0d1f1119bf5af78f0f40c25073ec4"&gt;如果要频繁生成动态内容或更改 title 和 meta 数据，则不要在 .aspx 文件中对这些内容进行硬编码。&lt;/span&gt; &lt;span  id="xn77_b64ef5da1b0f48640d5394b176a2d238"&gt;幸运的是，使用 ASP.NET 4.0 中的 Web 窗体可以轻松通过代码隐藏操作标题、关键字和页面描述：&lt;/span&gt; &lt;/p&gt;&lt;span id="ctl00_MTContentSelector1_mainContentContainer_ctl09"&gt;&#xD;
&lt;div  id="ctl00_MTContentSelector1_mainContentContainer_ctl09_"&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a  title="复制代码" href="http://www.cnblogs.com/xiangxiang/admin/javascript:CopyCode('ctl00_MTContentSelector1_mainContentContainer_ctl09_code');" target="_blank"&gt;&#xD;
&lt;div  style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; width: auto; height: 9px; border-right-width: 0px" align="center"&gt;&lt;/div&gt;复制代码 &lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div dir="ltr" style="background-color: #ddd"&gt;&lt;pre  id="ctl00_MTContentSelector1_mainContentContainer_ctl09_code" space="preserve"&gt;protected void Page_Load(object sender, EventArgs e)&#xD;
{&#xD;
if (!IsPostBack)&#xD;
{&#xD;
Page.Title = "Programming meta tags in ASP.NET 4.0";&#xD;
Page.MetaKeywords = "ASP.NET 4.0, meta, SEO, keywords";&#xD;
Page.MetaDescription =&#xD;
"How to use Page.Keywords and Page.Description in ASP.NET";&#xD;
}&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;span  id="xn78_e64dbdccfc9f1510b159de326c7267e7"&gt;SEO 注意事项&lt;/span&gt; &lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  id="xn79_23ab90ef38234b3526138a654c46aff5"&gt;&lt;strong&gt;某些站点&lt;/strong&gt;在页面中加入不相关的关键字、过多关键字或重复关键字，试图愚弄 Internet 搜索引擎。&lt;/span&gt; &lt;span  id="xn80_72ba74d21cd0289c4df4f9fc8b84b95e"&gt;这种做法（称为&amp;#8220;关键字堆砌&amp;#8221;）是一种针对特定搜索条件获取高搜索引擎排名的尝试，并不向真实访问者提供有用的内容。&lt;/span&gt; &lt;span  id="xn81_f6b09c12c00061b78e0e5807b0497b89"&gt;不幸登录这类站点的访问者不可避免地会感到失望，因为他们找不到任何实质内容，但合计站点广告收入时，这样的访问仍算作一次点击。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn82_14c51981aa9a4e56165bad74ad688d88"&gt;搜索引擎会尽力检测关键字堆砌这样的欺骗行为以保证其搜索结果的质量。&lt;/span&gt; &lt;span  id="xn83_431b8d4560e7988e043580bc4dd1b44b"&gt;因此，不要在太多位置使用太多关键字，以免搜索引擎将您的站点意外归入误导类别。&lt;/span&gt; &lt;span  id="xn84_1b2ca885a23904908d8bf46af6add049"&gt;搜索引擎会进行相应惩罚，从在搜索结果中降低页面的相对重要性，直至从搜索索引中完全删除网站内容。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn85_7419ae357d42868b810e9c88723e91bf"&gt;要避免的另一种做法是向搜索引擎爬网程序提供与普通访问者不同的内容。&lt;/span&gt; &lt;span  id="xn86_d1dd94e6a1c53e6aeb916b8cea0cb0ea"&gt;有些站点通过探查传入请求的用户代理标头或 IP 地址实现这种做法。&lt;/span&gt; &lt;span  id="xn87_c61341f0100c7a58ed1ee4231934d96e"&gt;尽管您也许能够想出这类行为的某些有用功能，但太多站点使用这种方法向搜索引擎隐藏众所周知的恶意软件和仿冒内容。&lt;/span&gt; &lt;span  id="xn88_c64bbc1a30c23b1412f388413203912e"&gt;如果搜索引擎检测到这类行为（称为&amp;#8220;掩蔽&amp;#8221;），就会进行惩罚。&lt;/span&gt; &lt;span  id="xn89_dcdfd7f8c36616e02cc6de9884f4b5ec"&gt;请诚实地提供优质内容，不要试图愚弄或操纵搜索引擎结果。&lt;/span&gt; &lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  id="xn90_14640c308afcd7f037d94231e20866b3"&gt;您可以了解在 Page_Load 事件中如何使用页面的 Title、MetaKeywords 和 MetaDescription 属性。&lt;/span&gt; &lt;span  id="xn91_90d45da4f99ff7157aba9d7ed6ab98d6"&gt;自 2.0 版起，ASP.NET 就提供 Title 属性，但 MetaKeywords 和 MetaDescription 是 ASP.NET 4.0 新增的功能。&lt;/span&gt; &lt;span  id="xn92_c9065efdd3fe5d8948dd1c521396d38f"&gt;尽管我们仍使用硬编码字符串，您还是可以从任意数据源加载这些属性值。&lt;/span&gt; &lt;span  id="xn93_071212ab6ea6be60070941ddcb38cc8c"&gt;然后您可以让其他人负责网站营销，调整元数据以实现最佳搜索引擎结果，而他们不必编辑页面的源代码。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn94_7d0a0fa02a50a53450540c9a827b050f"&gt;尽管有效的关键字和描述可以对搜索引擎结果起一点作用，但内容仍然是最重要的。&lt;/span&gt; &lt;span  id="xn95_e8d5e8e0a80c34ef5155c0f10bedd728"&gt;本文稍后还将介绍更多 HTML 技巧，不过，下面几部分将介绍 URL 在内容的查找和排名方面的重要作用。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span  id="xn96_ae037efeb4d1c50a3d5037c023902ead"&gt;规范 URL&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn97_3a80661eef7fb89e0a1fa626e1ece57a"&gt;重复内容通常会引起搜索引擎方面的问题。&lt;/span&gt; &lt;span  id="xn98_faf4397d307cc5214bc8b2c049520cf0"&gt;例如，假定搜索引擎在两个不同 URL 中找到了著名的 tacos 食谱。&lt;/span&gt; &lt;span  id="xn99_72a231585e060d4cbeb13dcaf2793280"&gt;搜索引擎会优先选择哪个 URL 并在搜索结果中提供链接呢？&lt;/span&gt; &lt;span  id="xn100_f38b942608f2aa276af37cc71c144f26"&gt;对于传入链接而言，重复问题更是一个优化问题。&lt;/span&gt; &lt;span  id="xn101_ced218d6e81e6a411c15f69e267b38df"&gt;如果 tacos 食谱的&amp;#8220;友情链接&amp;#8221;分布在两个不同的 URL 上，那您的著名 tacos 食谱可能就得不到应有的搜索引擎排名。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn102_4086af95c6ab69b738a332342240b0d5"&gt;很遗憾，您复制内容的时候可能没有意识到这一点。&lt;/span&gt; &lt;span  id="xn103_ffa4f314124312e1c9de3ec3465172da"&gt;如果搜索引擎从带 www 前缀和不带 www 前缀的 URL 发现您的站点，则会在两个不同的 URL 下看到同样的内容。&lt;/span&gt; &lt;span  id="xn104_38477b94e7b925c0b348acb42a8244f9"&gt;您需要使两个 URL 都起作用，但只需要使一个 URL 是标准或规范 URL。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn105_645983138f81853be84795e9b87612ef"&gt;举例来说，考虑一下 Microsoft.com 网站。&lt;/span&gt; &lt;span  id="xn106_693d653e4f83f94623d78443da7654f8"&gt;www.microsoft.com 和 microsoft.com 向您提供相同的内容。&lt;/span&gt; &lt;span  id="xn107_5249ea295a681d224bf20b8ac9e66e54"&gt;但是，请注意，如果使用 microsoft.com 进入主页，&lt;/span&gt; &lt;span  id="xn108_62c5e7539707a2d16080424f29e0bc58"&gt;Microsoft 站点会将您的浏览器重定向到 www.microsoft.com。&lt;/span&gt; &lt;span  id="xn109_6d7155989249a7c9ee39e0c114832134"&gt;Microsoft 使用重定向强制将 www.microsoft.com 作为其规范 URL。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn110_7564c4968f15028601f20bd8afdc0dbf"&gt;幸运的是，使用 ASP.NET 可以轻松将访问者重定向到您的规范 URL。&lt;/span&gt; &lt;span  id="xn111_1dc4b2c6b48e4a246cc5b70471ef0bb5"&gt;您需要做的只是在应用程序管道的 BeginRequest 事件期间提供某种逻辑。&lt;/span&gt; &lt;span  id="xn112_0f924acfdf46f36abc25528ee411a472"&gt;通过实现自定义 HTTP 模块，或在 global.asax 中使用 Application_BeginRequest 方法，都可实现这一目的。&lt;/span&gt; &lt;span  id="xn113_23b1db29576eb35a98ff0bfca3e0f4bb"&gt;用于此功能的逻辑如&lt;strong&gt;图 4&lt;/strong&gt; 所示。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn114_314deb53cb8f0747e68715af23ca9d54"&gt;&lt;strong&gt;图 4&lt;/strong&gt; 中的代码使用了 ASP.NET 4.0 中的又一新功能 &amp;#8212; HttpResponse 对象的 RedirectPermanent 方法。&lt;/span&gt; &lt;span  id="xn115_f8a57a33a2e627a4040e68a4383d2f51"&gt;ASP.NET 中传统的 Redirect 方法将一个 HTTP 状态代码 302 发回客户端。&lt;/span&gt; &lt;span  id="xn116_586f1bfec714f046d0d6f6e2c56d2044"&gt;302 告诉客户端，资源已临时移到新的 URL，客户端仅这一次应转到新 URL 查找资源。&lt;/span&gt; &lt;span  id="xn117_82f7144677d85c9dbd57c83ced417f3c"&gt;RedirectPermanent 方法将一个 301 代码发送到客户端。&lt;/span&gt; &lt;span  id="xn118_dc0de0275404cb3ce95a2374cf7f0346"&gt;301 告诉客户端，资源已永久移动，以后所有请求都应在新 URL 查找资源。&lt;/span&gt; &lt;span  id="xn119_3e0965cb09194b228ab8804aa856872e"&gt;请注意，对 RedirectPermanent 的调用还使用了 C# 4.0 中的新功能 &amp;#8212; 命名参数语法。&lt;/span&gt; &lt;span  id="xn120_e89ef951904294d6f2098cfccc1875e2"&gt;尽管此语法不是方法调用所必需的，但命名参数语法使得参数的目的更为明确。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn121_7b115fc6f1af49226b341a888f195344"&gt;使用重定向机制后，Web 浏览器和搜索引擎都会只使用您的规范 URL。&lt;/span&gt; &lt;span  id="xn122_b2a86d401e8ecb24291e9b39fa0bc29e"&gt;您的&amp;#8220;友情链接&amp;#8221;将得到加强，搜索引擎排名也会获得提升。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span  id="xn123_fc9acff0deec7ea58041214d54b458f5"&gt;描述性 URL&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn124_748f2cd3ef45da2a8006ee8d6fd195c9"&gt;图 4 &lt;strong&gt;HttpResponse 对象的 RedirectPermanent 方法&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&lt;span id="ctl00_MTContentSelector1_mainContentContainer_ctl10"&gt;&#xD;
&lt;div  id="ctl00_MTContentSelector1_mainContentContainer_ctl10_"&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a  title="复制代码" href="http://www.cnblogs.com/xiangxiang/admin/javascript:CopyCode('ctl00_MTContentSelector1_mainContentContainer_ctl10_code');" target="_blank"&gt;&#xD;
&lt;div  style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; width: auto; height: 9px; border-right-width: 0px" align="center"&gt;&lt;/div&gt;复制代码 &lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div dir="ltr" style="background-color: #ddd"&gt;&lt;pre  id="ctl00_MTContentSelector1_mainContentContainer_ctl10_code" space="preserve"&gt;void Application_BeginRequest(object sender, EventArgs e)&#xD;
{&#xD;
HttpApplication app = sender as HttpApplication;&#xD;
if (app != null)&#xD;
{&#xD;
string domain = "www.odetocode.com";&#xD;
string host = app.Request.Url.Host.ToLower();&#xD;
string path = app.Request.Url.PathAndQuery;&#xD;
if (!String.Equals(host, domain))&#xD;
{&#xD;
Uri newURL = new Uri(app.Request.Url.Scheme +&#xD;
"://" + domain + path);&#xD;
app.Context.Response.RedirectPermanent(&#xD;
newURL.ToString(), endResponse: true);&#xD;
}&#xD;
}&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;span  id="xn125_41c25e21d86d5b821db162c0a5bdeb14"&gt;在 2009 年 1 月月刊的 MSDN Magazine编写有关如何使用 ASP.NET Web 窗体 (&lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl11" onclick="javascript:Track('ctl00_MTContentSelector1_mainContentContainer_tgt125|ctl00_MTContentSelector1_mainContentContainer_ctl11',this);" href="http://msdn.microsoft.com/zh-cn/magazine/2009.01.extremeaspnet.aspx" target="_blank"&gt;msdn.microsoft.com/en-us/magazine/2009.01.extremeaspnet.aspx&lt;/a&gt;) 使用的.NET 3.5 SP1 路由功能。&lt;/span&gt; &lt;span  id="xn126_be118a7019036c1d9a39f53b3025f6da"&gt;文章中说，通过路由实现清洁的描述性 URL，这对用户和搜索引擎而言非常重要。&lt;/span&gt; &lt;span  id="xn127_42bfbd3be9b91bf19bbad1f6850c6619"&gt;在 /recipes/tacos 这样的 URL 中，用户和搜索引擎都可以获得比 /recipe.aspx?category=40&amp;amp;topic=32 更多的信息。&lt;/span&gt; &lt;span  id="xn128_78051671e501a97d459a63a56bd4ba33"&gt;在前一种方式下，搜索引擎将&amp;#8220;recipes&amp;#8221;和&amp;#8220;tacos&amp;#8221;作为资源的重要关键字。&lt;/span&gt; &lt;span  id="xn129_8ba0c0966217cf2082c3987eb642b5f7"&gt;后一个 URL 的问题在于，如果 URL 需要具有多个参数的查询字符串，则不利于很多搜索引擎爬网程序进行工作，而且查询字符串中的数字在应用程序后端数据库之外没有任何意义。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn130_29b668ddadee8a51ca08f2dbe2838f78"&gt;ASP.NET 团队向 4.0 版本添加了一些类，使得 Web 窗体路由更为轻松。&lt;/span&gt; &lt;span  id="xn131_b716ac196741ac63d100d57bbd03ecd7"&gt;的代码下载中，我已使用 ASP.NET 4.0 中的新类重新实现了 1 月期中的演示网站。&lt;/span&gt; &lt;span  id="xn132_c8c3cefb1f9b3846e876282df7445046"&gt;路由是通过描述应用程序在 Application_Start 事件中将处理的路由开始的。&lt;/span&gt; &lt;span  id="xn133_f0f35d3218ee69a1f0912ebd0ccaaebd"&gt;下面的代码是 global.asax 中该站点在 Application_Start 事件期间调用的 RegisterRoutes 方法：&lt;/span&gt; &lt;/p&gt;&lt;span id="ctl00_MTContentSelector1_mainContentContainer_ctl12"&gt;&#xD;
&lt;div  id="ctl00_MTContentSelector1_mainContentContainer_ctl12_"&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a  title="复制代码" href="http://www.cnblogs.com/xiangxiang/admin/javascript:CopyCode('ctl00_MTContentSelector1_mainContentContainer_ctl12_code');" target="_blank"&gt;&#xD;
&lt;div  style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; width: auto; height: 9px; border-right-width: 0px" align="center"&gt;&lt;/div&gt;复制代码 &lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div dir="ltr" style="background-color: #ddd"&gt;&lt;pre  id="ctl00_MTContentSelector1_mainContentContainer_ctl12_code" space="preserve"&gt;void RegisterRoutes()&#xD;
{&#xD;
RouteTable.Routes.Add(&#xD;
"Recipe",&#xD;
new Route("recipe/{name}",&#xD;
new PageRouteHandler("~/RoutedForms/RecipeDisplay.aspx",&#xD;
checkPhysicalUrlAccess:false)));&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;span  id="xn134_b943b1fe0bf340899214e702189a2149"&gt;URL Rewrite（Carlos Aguilar Mares 编写）&lt;/span&gt; &lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  id="xn135_2709afb6ed4fc66368ed70fce659bb3a"&gt;&lt;strong&gt;URL Rewrite for IIS 7.0&lt;/strong&gt; 是 Microsoft 提供的一种工具，可从 iis&lt;/span&gt; &lt;span  id="xn136_b53f7d585089f9b18b839094c27e9f10"&gt;net/extensions/URLRewrite.&lt;/span&gt; &lt;span  id="xn137_4d7c0763bc00c6a82bb9a0f82f7a4c63"&gt;此工具可以执行所有 URL 规范化工作，您不需要编写任何代码。&lt;/span&gt; &lt;span  id="xn138_6e9ebdf51fb10b6c9574834309e913ca"&gt;此工具会进行标头规范化、小写转换等工作（如以下博客文章所述：&lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl13" onclick="javascript:Track('ctl00_MTContentSelector1_mainContentContainer_tgt138|ctl00_MTContentSelector1_mainContentContainer_ctl13',this);" href="http://ruslany.net/2009/04/10-url-rewriting-tips-and-tricks/" target="_blank"&gt;ruslany.net/2009/04/10-url-rewriting-tips-and-tricks/&lt;/a&gt;).&lt;/span&gt; &lt;span  id="xn139_1ab1ec9139f36e840e4459a093b86271"&gt;此工具还通过使用映射进行重写或重定向来帮助&amp;#8220;修复&amp;#8221;中断的链接，因此，您甚至不需要更改应用程序/HTML。&lt;/span&gt; &lt;span  id="xn140_775c091444d10aee46f254fc04935bab"&gt;请参见：&lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl14" onclick="javascript:Track('ctl00_MTContentSelector1_mainContentContainer_tgt140|ctl00_MTContentSelector1_mainContentContainer_ctl14',this);" href="http://blogs.msdn.com/carlosag/archive/2008/09/02/IIS7UrlRewriteSEO.aspx" target="_blank"&gt;blogs.msdn.com/carlosag/archive/2008/09/02/IIS7UrlRewriteSEO.aspx&lt;/a&gt;&lt;/span&gt; &lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn141_031ec86cd26334ac1ca09f57af72863f"&gt;URL Rewrite 还可以为任意 ASP.NET 版本实现&amp;#8220;描述性&amp;#8221;URL，其性能远远优于任意其他现有方法，包括 ASP.NET 路由，因为该工具使用内核模式缓存。&lt;/span&gt; &lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span  id="xn142_b1373e8cf9f2965d9ce7b4c476ac87f4"&gt;图 5 &lt;strong&gt;从 RouteData 获取 Name 参数以显示关于食谱的信息&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&lt;span id="ctl00_MTContentSelector1_mainContentContainer_ctl15"&gt;&#xD;
&lt;div  id="ctl00_MTContentSelector1_mainContentContainer_ctl15_"&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a  title="复制代码" href="http://www.cnblogs.com/xiangxiang/admin/javascript:CopyCode('ctl00_MTContentSelector1_mainContentContainer_ctl15_code');" target="_blank"&gt;&#xD;
&lt;div  style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; width: auto; height: 9px; border-right-width: 0px" align="center"&gt;&lt;/div&gt;复制代码 &lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div dir="ltr" style="background-color: #ddd"&gt;&lt;pre  id="ctl00_MTContentSelector1_mainContentContainer_ctl15_code" space="preserve"&gt;private void DisplayRecipe()&#xD;
{&#xD;
var recipeName = RouteData.Values["name"] as string;&#xD;
if (recipeName != null)&#xD;
{&#xD;
var recipe = new RecipeRepository().GetRecipe(recipeName);&#xD;
if (recipe != null)&#xD;
{&#xD;
_name.Text = recipe.Name;&#xD;
_ingredients.Text = recipe.Ingredients;&#xD;
_instructions.Text = recipe.Instructions;&#xD;
}&#xD;
}&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;span  id="xn143_ae6f88721e0e9daffcef7781e461b392"&gt;回顾我在 1 月期发表的文章，您会记起为什么每个路由都必须指定一个路由处理程序。&lt;/span&gt; &lt;span  id="xn144_1e0cf44c875f5d8de4f09140db306ca5"&gt;在 RegisterRoutes 中，我们将&amp;#8220;Recipe&amp;#8221;路由的处理程序设置为 ASP.NET 4.0 中的一个新类 PageRouteHandler 的实例。&lt;/span&gt; &lt;span  id="xn145_5ef648eba6b0fd492077f9fdf3b8cd4a"&gt;路由引擎会将所有 recipe/{name} 形式的传入请求 URL 定向到此路由处理程序，其中 {name} 表示路由引擎将从该 URL 提取的路由参数。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn146_d09c0d6939de07ef78aea68e0c5148eb"&gt;Web 窗体可以通过 RouteData 属性访问路由引擎从该 URL 提取的所有路由参数。&lt;/span&gt; &lt;span  id="xn147_daf85f34769b9ca4d47611c1d0acd0f4"&gt;此属性是 4.0 中 Page 类的新增属性。&lt;/span&gt; &lt;span  id="xn148_4c93f6035b751eba726c413194d66ec3"&gt;&lt;strong&gt;图 5&lt;/strong&gt; 中的代码将从 RouteData 中获取 name 参数，然后使用该名称查找并显示关于食谱的信息：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn149_17f7696fe6e29b49575dafafb7a27a49"&gt;路由引擎的重要特征之一是它具有双向特性。&lt;/span&gt; &lt;span  id="xn150_608e399916dcd633fdd47cd888dca773"&gt;路由引擎不但能分析 URL 来管理 HTTP 请求，还可以生成 URL 来访问特定页面。&lt;/span&gt; &lt;span  id="xn151_28a421e317dd0c07899f4f946ab789ef"&gt;例如，如果要创建一个将访问者引导至 tacos 食谱的链接，可以使用路由引擎根据路由配置生成一个 URL（而不是硬编码该 URL）。&lt;/span&gt; &lt;span  id="xn152_78091b305ee6fe03a98930864a20ae3e"&gt;ASP.NET 4.0 引入了一个新的表达式生成器，您可以在标记中用它根据路由配置表生成 URL：&lt;/span&gt; &lt;/p&gt;&lt;span id="ctl00_MTContentSelector1_mainContentContainer_ctl16"&gt;&#xD;
&lt;div  id="ctl00_MTContentSelector1_mainContentContainer_ctl16_"&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a  title="复制代码" href="http://www.cnblogs.com/xiangxiang/admin/javascript:CopyCode('ctl00_MTContentSelector1_mainContentContainer_ctl16_code');" target="_blank"&gt;&#xD;
&lt;div  style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; width: auto; height: 9px; border-right-width: 0px" align="center"&gt;&lt;/div&gt;复制代码 &lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div dir="ltr" style="background-color: #ddd"&gt;&lt;pre  id="ctl00_MTContentSelector1_mainContentContainer_ctl16_code" space="preserve"&gt;&amp;lt;asp:HyperLink NavigateUrl="&amp;lt;%$ RouteUrl:RouteName=recipe,name=tacos %&amp;gt;"&#xD;
Text="Titillating Tacos" runat="server"&amp;gt;&#xD;
&amp;lt;/asp:HyperLink&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;span  id="xn153_eae67eed5538a409219cfa2c97723dbc"&gt;前面的代码说明操作中的新 RouteUrl 表达式生成器。&lt;/span&gt; &lt;span  id="xn154_3cf260ff9544688cde7b60475cd4e309"&gt;此表达式生成器告诉路由引擎为名为&amp;#8220;recipe&amp;#8221;的路由生成一个链接，并在 URL 中包含一个值为&amp;#8220;tacos&amp;#8221;的 name 参数。&lt;/span&gt; &lt;span  id="xn155_281a909d8b62347190157312f870dc1a"&gt;上述标记将生成下面的 HTML：&lt;/span&gt; &lt;/p&gt;&lt;span id="ctl00_MTContentSelector1_mainContentContainer_ctl17"&gt;&#xD;
&lt;div  id="ctl00_MTContentSelector1_mainContentContainer_ctl17_"&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a  title="复制代码" href="http://www.cnblogs.com/xiangxiang/admin/javascript:CopyCode('ctl00_MTContentSelector1_mainContentContainer_ctl17_code');" target="_blank"&gt;&#xD;
&lt;div  style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; width: auto; height: 9px; border-right-width: 0px" align="center"&gt;&lt;/div&gt;复制代码 &lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div dir="ltr" style="background-color: #ddd"&gt;&lt;pre  id="ctl00_MTContentSelector1_mainContentContainer_ctl17_code" space="preserve"&gt;&amp;lt;a href="/recipe/tacos"&amp;gt;Titillating Tacos&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;span  id="xn156_74e24471f740588e0c23e81c1bf2bdd6"&gt;上面的 URL 是友好的、描述性的且针对搜索引擎进行了优化。&lt;/span&gt; &lt;span  id="xn157_9877b261eeb2223dbee0888dca0dfc9f"&gt;但是，此示例引出了一个更大的关于 ASP.NET 的问题。&lt;/span&gt; &lt;span  id="xn158_b6614ced75b551b8e6037368831ff59e"&gt;Web 窗体的服务器控件经常抽象出它们所生成的 HTML，并且不是 ASP.NET 中的所有服务器控件对搜索引擎都是友好的。&lt;/span&gt; &lt;span  id="xn159_1ba3d3df3c1733b37e29090fd505779a"&gt;现在，我们该继续谈谈 HTML 了。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span  id="xn160_40c98f45b7ed58ad98eb733e10fd309c"&gt;HTML 错误&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn161_7a5aa947887e0c3b147987b8cd798528"&gt;如果我们使用 LinkButton（而不是 Hyperlink）创建指向 tacos 食谱的链接，我们会在浏览器中发现使用了不同的标记。&lt;/span&gt; &lt;span  id="xn162_e19f8f0811f2f39bd68d412444199458"&gt;LinkButton 的代码和它生成的 HTML 如下所示：&lt;/span&gt; &lt;/p&gt;&lt;span id="ctl00_MTContentSelector1_mainContentContainer_ctl18"&gt;&#xD;
&lt;div  id="ctl00_MTContentSelector1_mainContentContainer_ctl18_"&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;a  title="复制代码" href="http://www.cnblogs.com/xiangxiang/admin/javascript:CopyCode('ctl00_MTContentSelector1_mainContentContainer_ctl18_code');" target="_blank"&gt;&#xD;
&lt;div  style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; width: auto; height: 9px; border-right-width: 0px" align="center"&gt;&lt;/div&gt;复制代码 &lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div dir="ltr" style="background-color: #ddd"&gt;&lt;pre  id="ctl00_MTContentSelector1_mainContentContainer_ctl18_code" space="preserve"&gt;&amp;lt;asp:LinkButton runat="server" Text="Tacos"&#xD;
PostBackUrl="&amp;lt;%$ RouteUrl:RouteName=recipe,name=tacos %&amp;gt;"&amp;gt;&#xD;
&amp;lt;/asp:LinkButton&amp;gt;&#xD;
&amp;lt;!-- generates the following (excerpted): --&amp;gt;&#xD;
&amp;lt;a href="javascript:WebForm_DoPostBackWithOptions(...)"&amp;gt;Tacos&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;span  id="xn163_2ded02fbfd61622650a2963b6c7ab07e"&gt;我们仍然有一个定位标记供用户单击，但该定位标记使用 JavaScript 强制浏览器回发到服务器。&lt;/span&gt; &lt;span  id="xn164_4a4dee68d690ae590c4aa70c81e7c94f"&gt;LinkButton 呈现此 HTML 是为了在用户单击该链接时引发服务器端 Click 事件。&lt;/span&gt; &lt;span  id="xn165_6e53c513be508b2053b12f7575993be3"&gt;很遗憾，JavaScript 回发导航和搜索引擎不能协作。&lt;/span&gt; &lt;span  id="xn166_651c4d6a2604cb9b002a1cd3c8b7ba94"&gt;该链接实际上对搜索引擎是不可见的，搜索引擎肯定找不到目标页面。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://i.msdn.microsoft.com/ee405899.figure6(en-us).gif" /&gt; &lt;br /&gt;&lt;span  id="xn167_6301f9e19e1f8f24286559b3824dcad2"&gt;图 6 &lt;strong&gt;IIS 7 管理器&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn168_e8e81aab315450e3371f4574b169edfe"&gt;因为服务器端 ASP.NET 控件会抽象出 HTML，所以您必须正确选择服务器控件。&lt;/span&gt; &lt;span  id="xn169_925f62c417c5bd179a274518a04fc4ed"&gt;如果要在 ASP.NET 环境中完全控制 HTML 标记，应考虑使用 ASP.NET MVC 框架。&lt;/span&gt; &lt;span  id="xn170_656ed4a3ae53f4cde0539afc750d67a7"&gt;在使用 MVC 框架时，是不能使用服务器控件的，基础结构和 API 只能用于 HTML 标记。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn171_1bc9d50158b2bfed3dc6e73b4fa93af3"&gt;如果要使用 ASP.NET Web 窗体并针对搜索引擎进行优化，可以查看由服务器控件生成的 HTML 源。&lt;/span&gt; &lt;span  id="xn172_e91687c5cf989923437f706230e9507f"&gt;每个 Web 浏览器都会提供此选项。&lt;/span&gt; &lt;span  id="xn173_da8fdc6977ca17df5f94481a197880b3"&gt;在 Internet Explorer 中，使用&amp;#8220;查看&amp;#8221;-&amp;gt;&amp;#8220;源文件&amp;#8221;命令。&lt;/span&gt; &lt;span  id="xn174_5ffd996576cde3aa9f908748c7f223d1"&gt;请注意在导航方案中呈现 HTML 和 JavaScript 组合的所有控件。&lt;/span&gt; &lt;span  id="xn175_98fb2cdc7b74bc0b7bb1849f406d9950"&gt;例如，如果使用 AutoPostBack 属性设置为 true 的 DropDownList，则需要 JavaScript 才能正常运行。&lt;/span&gt; &lt;span  id="xn176_7b7c2987c55acef0c3fca85bc899b4f4"&gt;如果依赖于自动回发导航到新内容，则会使这些内容对搜索引擎不可见。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn177_419ae6de58f0f96651ab3ae23500c373"&gt;显然，采用较多 AJAX 技术的应用程序会引起搜索引擎方面的问题。&lt;/span&gt; &lt;span  id="xn178_60a6b0d830a1a40375a92c1ed4d251de"&gt;UpdatePanel 控件和从 JavaScript 调用的 Web 服务所生成的内容对于搜索引擎并不友好。&lt;/span&gt; &lt;span  id="xn179_eb38f834f677a0eefc6bf1fdbd2e2a89"&gt;进行 SEO 工作的最安全的方法，是将内容直接放入 HTML，以便搜索引擎能够找到它。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn180_f0e90b975b4589b913fadfc682f42870"&gt;调整 HTML、关键字和 URL 后，如何衡量结果？&lt;/span&gt; &lt;span  id="xn181_9b1be2c41b4e70745f8bc843eb2fb367"&gt;尽管搜索引擎排名是对 SEO 工作的最终判断，不过，仍然建议您在站点发布和搜索引擎对您的页面进行爬网处理之前发现所有问题。&lt;/span&gt; &lt;span  id="xn182_0ee13d8e3ca9caa5207c37e6f21501c1"&gt;Visual Studio 会提醒您注意 HTML 验证问题，但它不会就缺少元数据和规范 URL 给出警告。&lt;/span&gt; &lt;span  id="xn183_3d89d128d0c57b7ee6d3ab75c7d8212c"&gt;这是新产品 (IIS SEO Toolkit) 的工作。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://i.msdn.microsoft.com/ee405899.figure7(en-us).gif" /&gt; &lt;br /&gt;&lt;span  id="xn184_8bf430bedc53b8a3c2e10d924765164d"&gt;图 7 &lt;strong&gt;报告摘要&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span  id="xn185_e990dd010776f914185ff6852d420a64"&gt;IIS SEO Toolkit&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn186_4c571ff7485c62dd3e3c3e63c4992895"&gt;在 IIS SEO 工具包 IIS 7 的免费下载，可以从 &lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl21" onclick="javascript:Track('ctl00_MTContentSelector1_mainContentContainer_tgt186|ctl00_MTContentSelector1_mainContentContainer_ctl21',this);" href="http://iis.net/extensions/SEOToolkit" target="_blank"&gt;iis.net/extensions/SEOToolkit&lt;/a&gt;。&lt;/span&gt; &lt;span  id="xn187_56603ded6de8bcec0111013d0eb135f5"&gt;该工具包提供一个爬网引擎，该引擎像搜索引擎一样将本地 Web 应用程序编入索引，并提供详细的站点分析报告。&lt;/span&gt; &lt;span  id="xn188_55c21531fdc4be388f6e4b81eb96ee8f"&gt;该工具包还可以管理 robots.txt 和 sitemap 文件。&lt;/span&gt; &lt;span  id="xn189_da41f37b1ca37c2e4ba17779f4a6ab57"&gt;robots 文件以标准化格式通知搜索引擎哪些是不编入索引的内容，而 sitemap 文件可以将搜索引擎引导至要编入索引的内容。&lt;/span&gt; &lt;span  id="xn190_a623ab06bd3d047ec320510025273329"&gt;您还可以使用 sitemap 文件向搜索引擎提供资源更改的优先级、更改率和日期。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn191_df9f4760395db7546d4b3f40f44af330"&gt;对于 SEO 工作，站点分析报告非常有用。&lt;/span&gt; &lt;span  id="xn192_959866e689e80703a776c8a6789c0ac7"&gt;此报告可从搜索引擎的角度提供关于站点的所有信息。&lt;/span&gt; &lt;span  id="xn193_eb42560ca63e9f99b7566f927701fe35"&gt;安装该工具包后，IIS 7 管理器窗口中将为站点显示&amp;#8220;Site Analysis&amp;#8221;选项，如&lt;strong&gt;图 6&lt;/strong&gt; 所示。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn194_956fc8d5a4f0742d58b50728f0c018b7"&gt;双击该图标，则会显示以前运行的报告的列表，并提供一个用于运行新分析的&amp;#8220;Action&amp;#8221;选项。&lt;/span&gt; &lt;span  id="xn195_6331cd066f028cbbe4fdd7cb3b4726ac"&gt;运行分析非常简单，需要的操作只是使该工具指向本地 HTTP URL，然后单击&amp;#8220;确定&amp;#8221;。&lt;/span&gt; &lt;span  id="xn196_c9f0d443b09de191be42d6008bb197d7"&gt;分析完成后，工具包将打开报告摘要，如&lt;strong&gt;图 7&lt;/strong&gt; 所示。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn197_e9b69c53eaf951e34a074f96ec262c1f"&gt;该工具包应用大量规则和试探法，以发现与 SEO 和性能相关的问题。&lt;/span&gt; &lt;span  id="xn198_869b3c47935c8b1223c0953d4846849d"&gt;您可以找到中断的链接、缺失的标题、过短的描述、过长的描述以及大量其他潜在问题。&lt;/span&gt; &lt;span  id="xn199_e10b8fb5e9f46d175b50869803427af1"&gt;该工具包分析链接并提供报告，报告内容包括链接最多的页面和访问者访问特定页面需使用的路径方面的信息。&lt;/span&gt; &lt;span  id="xn200_18fbdde26997185a3476613564f917f2"&gt;该工具包甚至针对每个页面的内容提供逐字分析。&lt;/span&gt; &lt;span  id="xn201_88504a8fedc551fdac5289cc23992b67"&gt;您可以使用逐字分析功能为页面查找最佳关键字。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn202_3142477220f466981ee89d1a16940967"&gt;使用 IIS SEO Toolkit 可以发现需要进行的 SEO 工作，还可以验证已完成的所有 SEO 工作。&lt;/span&gt; &lt;span  id="xn203_7adbda16cbd7ccb5b838141887bafecc"&gt;撰写本文时，该工具包提供 Beta 1 版本。&lt;/span&gt; &lt;span  id="xn204_897079ed01f8af67d9187cec732d13d8"&gt;除了某些可自动修复特定问题的智能功能外，未来的新版本将继续增加规则和分析功能。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span  id="xn205_0f29cc39e630339f94afad264af7a425"&gt;简单高效&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  id="xn206_122c106788f7bdb4eecefc37d878fb11"&gt;即使有世界上最优质的内容，也需要搜索引擎将它们展现给访问者。&lt;/span&gt; &lt;span  id="xn207_ef46c9865e433440b63c8f27f8c241f2"&gt;SEO 是像搜索引擎一样思考的做法，能增强您的站点对爬网程序和排名算法的吸引力。&lt;/span&gt; &lt;span  id="xn208_86e8cf8fd1d6f43875e3b66107eb6732"&gt;Visual Studio 2010 和 ASP.NET 4.0 引入了一些新功能，使得在 .NET 4.0 中进行 SEO 工作更为轻松，而 IIS SEO Toolkit 是一款很好的工具，可使站点更好地配合搜索引擎。&lt;/span&gt; &lt;span  id="xn209_2b0d0fba3dd4ec78b8894294a99e7df2"&gt;通过组合使用这三种工具，可以简单高效地进行 SEO 工作。&lt;/span&gt; &lt;/p&gt;&lt;img src="http://www.cnblogs.com/xiangxiang/aggbug/1734716.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/xiangxiang/archive/2010/05/13/1734716.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/xiangxiang/archive/2009/11/28/1612581.html</id><title type="text">WidgetIfYr.com：将代码转化为Widget</title><summary type="text">近年来，伴随着独立博客和SNS社交网络而生的一个技术名词或者工具就是被称之为Widget的小插件了。对于不懂技术的人而言，Widget帮助完善了很多功能；而对于有技术功底的人而言，通过Widget让自己的代码让更多的人分享，也有种成就感，甚至赚了不少小钱。今天所介绍的网站WidgetIfYr.com本质上是种小插件工具，它能够让任何人将自己所编写的代码直接转化为Widget插件，很有趣吧？Widg...</summary><published>2009-11-28T05:29:00Z</published><updated>2009-11-28T05:29:00Z</updated><author><name>想想</name><uri>http://www.cnblogs.com/xiangxiang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/xiangxiang/archive/2009/11/28/1612581.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/xiangxiang/archive/2009/11/28/1612581.html"/></entry></feed>
