Ломаю голову, чтобы получить 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
удачи.