Ломаю голову, чтобы получить Url Routing в среде размещения IIS 7: ASP.NET

Я пытаюсь реализовать маршрутизацию URL ASP.NET с помощью System.Web.Routing. И это, похоже, отлично работает на моем локальном хосте, но когда я иду в прямом эфире, я получаю ошибку IIS 7 404 (файл не найден). FYI хостинг использует Windows Server 2008 IIS7.

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

Настройки Web.Config 
      

И затем у меня есть раздел system.webserver, который имеет следующую разметку

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      <add name="UrlRoutingModule"
               type="System.Web.Routing.UrlRoutingModule, 
                   System.Web.Routing, Version=3.5.0.0, 
                   Culture=neutral, 
                   PublicKeyToken=31BF3856AD364E35" />

    </modules>
    <handlers>
      <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </handlers>   

</system.webServer>

Затем в разделе Application_Start я определил один маршрут следующим образом:

void Application_Start(object sender, EventArgs e) 
{
    RegisterRoutes(RouteTable.Routes); 
}
void RegisterRoutes(RouteCollection routes)
{               
    routes.Add(
       "MyRoute",
          new Route("ProductDetail/{ProductId}/{ProductName}",
                new MyRouteHandler("~/ProductDetail.aspx")));
}

Наконец, MyRouteHandler выглядит следующим образом:

 public IHttpHandler GetHttpHandler(RequestContext requestContext)
 {
     var display = (Page)BuildManager.CreateInstanceFromVirtualPath(
                     _virtualPath, typeof(Page));
     HttpContext.Current.Items["ProductId"] = requestContext.RouteData.Values["Product"]; 
     return display;
 }

И на маршрутизированной странице я собираю идентификатор продукта следующим образом

ProductId = (int)HttpContext.Current.Items["Product"];

И это конец моего беспорядка. И это прекрасно работает на местном уровне. Я пробовал это некоторое время, но до сих пор не удалось.

ЛЮБАЯ ПОМОЩЬ БУДЕТ ГЛУБОКО ПРИЗНАНА.

Спасибо...

Ответ 1

Не уверен, что вам удалось выяснить, в чем проблема... однако, если вы все еще ищете решение, вы можете попробовать следующее. Мне пришлось столкнуться с такой же ситуацией некоторое время назад и заставить ее работать, используя правила перезаписи в веб-конфигурации, для которых вам не нужен какой-либо механизм маршрутизации. Поэтому сначала я рекомендую вам удалить любой параметр маршрутизации, который у вас есть, и код из файла Global.asax.

Затем в разделе вы можете добавить правила перезаписи следующим образом

<rewrite>
    <rewriteMaps>
        <rewriteMap name="map1" defaultValue="(.+)"/>
    </rewriteMaps>
    <rules>
        <rule name="Rewrite rule1 for map1">
        <match url="product/(.+)/(.+)"/>
        <conditions>
            <add input="{map1:{REQUEST_URI}}" pattern="(.+)"/>
        </conditions>
        <action type="Rewrite" url="productdetail.aspx?Product={R:1}" appendQueryString="false" redirectType="Permanent"/>
        </rule>
    </rules>
  </rewrite>

Если у вас есть проблемы с пониманием механизма перезаписи, я бы рекомендовал вам прочитать эту статью Скотта Гатри.

Я думаю, что это должно работать для вас с учетом среды IIS 7.0 или 7.5.

Ответ 2

Я следил за этой статьей: Как использовать маршрутизацию с веб-формами

До того, как я нашел его, у меня были проблемы с моим общим хостом и ни один локальный. Это был мой web.config.

Мой хост использовал IIS 7 со встроенным конвейером, мне это не хватало:

<handlers>
    <!---after all the others--->       
    <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*"
             path="UrlRouting.axd"
             type="System.Web.HttpForbiddenHandler,
             System.Web, Version=2.0.0.0,
             Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</handlers>

ИЗМЕНИТЬ: В соответствии с вашими настройками и кодом осталось только проверить, есть ли у вас DLL Routing, определенная в web.config, а также развернута в каталоге bin:

<add assembly="System.Web.Routing, Version=3.5.0.0, 
  Culture=neutral, 
  PublicKeyToken=31BF3856AD364E35"/>

Ответ 3

Попробуйте это в web.config. Работал для меня.

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

Ответ 4

Просто чтобы сообщить, что было наконец моим решением... на IIS7 измените режим конвейера на Integrated, и я предложил добавить некоторые строки в web.config по ссылке выше... http://msdn.microsoft.com/en-us/library/cc668202.aspx

удачи.