如何告诉IIS7将流量重定向到asp.net

时间:2011-08-05 13:10:09

标签: asp.net iis iis-7 url-rewriting

我在global.asax中有一个url重写例程,当用户键入:

http://example.com/products/category/electronics

服务器服务:

http://example.com/products.aspx?category=45

问题是IIS7不会发送此请求由asp.net处理,因为请求的路径在目录结构中没有文件夹。

如何在不为每个产品和类别创建目录的情况下告诉IIS让asp.net处理此请求?

2 个答案:

答案 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:

  

Using the URL Rewrite Module

您有两种解决方案之一 -

  1. 使用URL Rewrite Map并将每个类别名称映射到类别ID:

    Global.asax
  2. 使用更“动态”的重写:

    <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="^([^=&amp;]+)=([^=&amp;]+)$" /> </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。

  3. 将重写责任传递给IIS7的URL重写模块(或任何其他重写器,如Iconics IIRF或HeliconTech的ISAPI重写)意味着您可以单独更改这些规则,而不是将它们刻录到代码中。将这些规则刻录到代码中意味着每次进行更改时都必须重新部署。