我在global.asax
中有一个url重写例程,当用户键入:
http://example.com/products/category/electronics
服务器服务:
http://example.com/products.aspx?category=45
问题是IIS7不会发送此请求由asp.net处理,因为请求的路径在目录结构中没有文件夹。
如何在不为每个产品和类别创建目录的情况下告诉IIS让asp.net处理此请求?
答案 0 :(得分:2)
从技术上讲,你没有IIS这样做,你使用URL重写来做到这一点。这是ASP.NET MVC的常规功能。但是,它也可以在“经典”基于表单的asp.net中使用。
这里有一篇关于它的文章:http://msdn.microsoft.com/en-us/library/ms972974.aspx
本文列出了许多实现此目的的方法,以及编写httpModule的详细说明。
事实上,这篇文章展示了如何完全按照你的要求行事。在页面上搜索“当用户访问/Products/Beverages.aspx时”页面上的内容,它将直接向您展示其工作原理。 (文章中的说明更高。)
答案 1 :(得分:2)
简而言之,请勿在{{1}}中执行此操作。请改用IIS7 Url Rewriter:
您有两种解决方案之一 -
使用URL Rewrite Map并将每个类别名称映射到类别ID:
Global.asax
使用更“动态”的重写:
<rewrite>
<rewriteMaps>
<rewriteMap name="StaticRewrites">
<add key="/products/category/electronics" value="/products.aspx?category=45" />
<add key="/products/category/books" value="/products.aspx?category=46" />
<add key="/products/category/dvds" value="/products.aspx?category=47" />
</rewriteMap>
</rewriteMaps>
<rules>
<rule name="Rewrite Rule 1 for StaticRewrites" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Rewrite" url="{C:1}" appendQueryString="False"/>
</rule>
</rules>
</rewrite>
在上述情况下,您需要更改<rewrite>
<rules>
<rule name="RedirectUserFriendlyURL1" stopProcessing="true">
<match url="^products\.aspx$" />
<conditions>
<add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
<add input="{QUERY_STRING}" pattern="^([^=&]+)=([^=&]+)$" />
</conditions>
<action type="Redirect" url="products/{C:1}/{C:2}" appendQueryString="false" />
</rule>
<rule name="RewriteUserFriendlyURL1" stopProcessing="true">
<match url="^products/([^/]+)/([^/]+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="products.aspx?{R:1}={R:2}" />
</rule>
</rules>
</rewrite>
页面以接受类别名称,然后在该页面中查找数据库中类别的实际整数ID。
将重写责任传递给IIS7的URL重写模块(或任何其他重写器,如Iconics IIRF或HeliconTech的ISAPI重写)意味着您可以单独更改这些规则,而不是将它们刻录到代码中。将这些规则刻录到代码中意味着每次进行更改时都必须重新部署。