Как сказать IIS7 перенаправить трафик на asp.net - PullRequest
1 голос
/ 05 августа 2011

У меня есть подпрограмма перезаписи URL в global.asax, когда пользователь вводит:

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

сервер обслуживает:

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

проблема заключается в том, что IIS7 не отправляет этот запрос на обработку asp.net, поскольку запрошенный путь не имеет папки в структуре каталогов.

Как я могу сказать IIS разрешить обработку этого запросаasp.net без создания каталога для каждого продукта и категории?

Ответы [ 2 ]

2 голосов
/ 05 августа 2011

В двух словах, не делайте этого в вашем Global.asax. Вместо этого используйте переписчик URL IIS7:

Использование модуля перезаписи URL

У вас есть одно из двух решений -

  1. Используйте Карта перезаписи URL и сопоставьте каждое имя категории с идентификатором категории:

    <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>
    
  2. Используйте более «динамическое» переписывание:

    <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>
    

    В приведенном выше случае вам нужно изменить страницу products.aspx, чтобы она принимала имя категории, затем на этой странице найдите действительный целочисленный идентификатор категории в базе данных.

Передача ответственности за перезапись на модуль перезаписи URL IIS7 (или любое другое переписывающее устройство, такое как Iconics IIRF или перезапись ISAPI HeliconTech) означает, что вы можете изменять эти правила отдельно, а не записывать их в свой код. Внедрение этих правил в ваш код означает, что вы должны повторно развертывать каждый раз, когда вносите изменения.

2 голосов
/ 05 августа 2011

Технически у вас нет IIS, чтобы сделать это, вы используете перезапись URL, чтобы сделать это. Это нормальная особенность ASP.NET MVC. Однако это возможно и в «классической» форме asp.net.

Здесь есть статья об этом: http://msdn.microsoft.com/en-us/library/ms972974.aspx

В этой статье перечислено несколько способов сделать это, а также подробное объяснение написания httpModule.

На самом деле, статья показывает, как сделать именно то, что вы просите. Выполните поиск на странице «когда пользователь заходит на страницу /Products/Beverages.aspx» на странице, и вы сразу же увидите, как это работает. (Инструкции выше в статье.)

...