Ошибка маршрутизации HTTP 404.0 0x80070002 - PullRequest
8 голосов
/ 15 апреля 2011

Я создал правила маршрутизации в своем приложении ASP.NET, и на моей машине Dev на IIS7 все работает нормально. При развертывании решения на Prod Server, который также имеет IIS7, я получаю ошибку 404 (страница не найдена) при доступе к URL. Может быть, кто-то может указать, где проблема?

Фактическая ошибка

Ошибка HTTP 404.0 - не найден ресурс, который вы ищете, был удален, изменилось ли его имя или Временно недоступен. детализированный Информация об ошибкахМодуль IIS Web Core Карта уведомленийRequestHandler Код ошибки обработчика статического файла 0x80070002 Запрошенный URL http://xxx.xxx.xxx.xxx:80/pdf-button Физический Путь C: \ www \ pathtoproject \ pdf-button Вход в систему Метод Аноним Вход в систему Пользователь Аноним

Мой фактический код

     <add key="RoutePages" value="all,-forum/"/>

             UrlRewrite.Init(ConfigurationManager.AppSettings["RoutePages"]);


    public static class UrlRewrite
    {
            public static void Init(string routePages)
            {

                _routePages = routePages.ToLower().Split(new[] { ',' });
                RegisterRoute(RouteTable.Routes);




            }

            static void RegisterRoute(RouteCollection routes)
            {

                routes.Ignore("{resource}.axd/{*pathInfo}");
                routes.Ignore("favicon.ico");
                foreach (string routePages in _routePages)
                {
                    if (routePages == "all")
                        routes.MapPageRoute(routePages, "{filename}", "~/{filename}.aspx");
                    else
                        if (routePages.StartsWith("-"))
                            routes.Ignore(routePages.Replace("-", ""));
                        else
                        {
                            var routePagesNoExt = routePages.Replace(".aspx", "");
                            routes.MapPageRoute(routePagesNoExt, routePagesNoExt, string.Format("~/{0}.aspx", routePagesNoExt));
                        }
                }

            }
}

Ответы [ 6 ]

24 голосов
/ 15 апреля 2011

Только что обнаружили, что строки ниже должны быть добавлены в файл web.config, теперь все отлично работает и на рабочем сервере.

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" >
   <remove name="UrlRoutingModule"/>    
  </modules>
</system.webServer>
11 голосов
/ 22 октября 2015

Предлагаемое решение

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" >
    <remove name="UrlRoutingModule"/>    
  </modules>
</system.webServer>

работает, но может ухудшить производительность и даже привести к ошибкам, поскольку теперь все зарегистрированные модули HTTP запускаются для каждого запроса, а не только для управляемых запросов (например, .aspx).Это означает, что модули будут работать с каждым .jpg .gif .css .html .pdf и т. Д.

Более разумным решением является включение этого в ваш web.config:

<system.webServer>
  <modules>
    <remove name="UrlRoutingModule-4.0" />
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
  </modules>
</system.webServer>

Кредит наон идет к Колину Фарру.Зацените его пост на эту тему на http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html.

2 голосов
/ 17 марта 2012

Мое решение, после попытки ВСЕГО:

Плохое развертывание, старый PrecompiledApp.config зависал вокруг моего местоположения развертывания и заставлял все не работать.

Мойокончательные настройки, которые сработали:

  • IIS 7.5, Win2k8r2 x64,
  • Пул приложений в интегрированном режиме
  • Ничего не меняется в файле web.config - это означает отсутствие специальных обработчиков для маршрутизации.Вот мой снимок разделов, ссылки на многие другие сообщения.Я использую FluorineFX, поэтому мне добавили этот обработчик, но другие мне не нужны:

    <system.web>
      <compilation debug="true" targetFramework="4.0" />
      <authentication mode="None"/>
    
      <pages validateRequest="false" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
      <httpRuntime requestPathInvalidCharacters=""/>
    
      <httpModules>
        <add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx"/>
      </httpModules>
    </system.web>
      <system.webServer>
        <!-- Modules for IIS 7.0 Integrated mode -->
        <modules>
          <add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx" />
        </modules>
    
        <!-- Disable detection of IIS 6.0 / Classic mode ASP.NET configuration -->
        <validation validateIntegratedModeConfiguration="false" />
      </system.webServer>
    
  • Global.ashx: (только метод любой заметки)

    void Application_Start(object sender, EventArgs e) {
        // Register routes...
        System.Web.Routing.Route echoRoute = new System.Web.Routing.Route(
              "{*message}",
            //the default value for the message
              new System.Web.Routing.RouteValueDictionary() { { "message", "" } },
            //any regular expression restrictions (i.e. @"[^\d].{4,}" means "does not start with number, at least 4 chars
              new System.Web.Routing.RouteValueDictionary() { { "message", @"[^\d].{4,}" } },
              new TestRoute.Handlers.PassthroughRouteHandler()
           );
    
        System.Web.Routing.RouteTable.Routes.Add(echoRoute);
    }
    
  • PassthroughRouteHandler.cs - это обеспечило автоматическое преобразование из http://andrew.arace.info/stackoverflow в http://andrew.arace.info/#stackoverflow, которое затем будет обрабатываться по умолчанию. Aspx:

    public class PassthroughRouteHandler : IRouteHandler {
    
        public IHttpHandler GetHttpHandler(RequestContext requestContext) {
            HttpContext.Current.Items["IncomingMessage"] = requestContext.RouteData.Values["message"];
            requestContext.HttpContext.Response.Redirect("#" + HttpContext.Current.Items["IncomingMessage"], true);
            return null;
        }
    }
    
1 голос
/ 16 декабря 2015

Проблема для меня была в том, что новый сервер System.Web.Routing имел версию 3.5, а web.config запросил версию 4.0.0.0. Разрешение было

% WINDIR% \ Framework \ v4.0.30319 \ aspnet_regiis -i

% WINDIR% \ Framework64 \ v4.0.30319 \ aspnet_regiis -i

0 голосов
/ 02 марта 2017

Наличие этого в Global.asax.cs решило это для меня.

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}
0 голосов
/ 10 апреля 2015

Снимите этот флажок в Проводнике Windows.

"Скрыть расширения типов файлов для известных типов"

...