ASP.NET MVC на IIS 6 - сопоставление с подстановочными знаками - входящий запрос не соответствует ни одному маршруту - PullRequest
8 голосов
/ 09 ноября 2008

Я пытался настроить приложение Beta 1 MVC на IIS 6 и не могу запустить его правильно. Я добавил сопоставление с подстановочными знаками в .net isapi DLL, как предлагается в других сообщениях в блоге, но при доступе к корню веб-сайта получаю следующую ошибку:

The incoming request does not match any route.
..
[HttpException (0x80004005): The incoming request does not match any route.]
   System.Web.Routing.UrlRoutingHandler.ProcessRequest(HttpContextBase httpContext) +147
   System.Web.Routing.UrlRoutingHandler.ProcessRequest(HttpContext httpContext) +36
   System.Web.Routing.UrlRoutingHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext context) +4
   HCD.Intranet.Web.Default.Page_Load(Object sender, EventArgs e) +81
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436

Я использую страницу Default.aspx, предоставленную в шаблонном приложении MVC, которая корректно перезаписывает доступ к корню веб-сайта.

public partial class Default : Page
{
    public void Page_Load(object sender, System.EventArgs e)
    {
        HttpContext.Current.RewritePath(Request.ApplicationPath);
        IHttpHandler httpHandler = new MvcHttpHandler();
        httpHandler.ProcessRequest(HttpContext.Current);
    }
}

Если я пытаюсь получить доступ к маршруту в приложении, например / Project, я получаю стандартную страницу ошибок IIS 404, а не страницу ошибок .net.

Я попытался добавить следующую строку в мой раздел http.Handlers Web.config:

<add verb="*" path="*" validate="false" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

Это дало мне другую ошибку - страницу ошибки .net 404.

Я добавил следующее в свой Global.asax, который ничего не сделал:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    if (Context.Request.FilePath.Equals("/"))
        Context.RewritePath("Default.aspx");
}

Я использую следующую конфигурацию маршрута (использует маршрутизацию restful, предоставленную проектом MvcContrib):

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
SimplyRestfulRouteHandler.BuildRoutes(routes);
routes.MapRoute(
"Default", 
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
);

Любые предложения будут приниматься всерьез, поскольку я исчерпал все варианты, которые у меня есть на данный момент.

Большое спасибо.

Ответы [ 3 ]

18 голосов
/ 11 ноября 2008

Вот что я сделал, чтобы URL-адреса без расширений работали с IIS 6 и ASP.NET MVC Beta 1.

  • Создание бета-версии ASP.NET MVC по умолчанию спроектировать и скомпилировать.
  • Создать новый веб-сайт IIS, указывающий на каталог приложения.
  • В свойствах IIS для веб-сайт, нажмите HomeDirectory таб.
  • Нажмите кнопку «Конфигурация ...». На вкладке «Сопоставления» нажмите "Вставить ..."
  • Рядом с «подстановочным знаком» метка "maps" В текстовом поле введите "C: \ Windows \ microsoft.net \ Framework \ v2.0.50727 \ aspnet_isapi.dll"
  • Снимите флажок «Подтвердить» этот файл существует "Нажмите OK
  • Перейдите в / home Это сработало!

Вам вообще не нужно менять web.config. Вам просто нужно сопоставить все запросы IIS с dll ASP.NET Isapi, иначе ASP.NET никогда не получит эти запросы.

8 голосов
/ 12 ноября 2008

ОК, все заработало.

Проблема заключалась в том, что я использовал автоматизированную сборку msbuild для упаковки файлов, которые мне нужно было развернуть, и мне не хватало global.asax.

Таким образом, похоже, что если global.asax не развернут на сайте, то ни один из маршрутов не будет подключен. Это означает, что правильное обращение к корню веб-сайта приводит к ошибке «Входящий запрос не соответствует ни одному маршруту», и любые другие запросы больше не маршрутизируются через классы контроллера, поэтому в результате получается 404.

НТН.

1 голос
/ 09 ноября 2008

К сожалению, IIS 6 требуется расширение файла для сопоставления запроса с правильным обработчиком, что означает, что вам придется использовать суффикс .mvc в именах контроллеров, например, / {controller} .mvc / {action}

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

SimplyRestfulRouteHandler.BuildRoutes(routes);

routes.MapRoute(
      "Default",
      "{controller}.mvc/{action}/{id}",
      new { controller = "Home", action = "Index", id = "" }
);

Однако есть способы обойти это в зависимости от вашего уровня контроля на сервере IIS 6. Пожалуйста, обратитесь к следующим страницам для получения дополнительной информации

...