ASP.NET MVC не обслуживает документ по умолчанию - PullRequest
21 голосов
/ 11 марта 2010

У меня есть приложение ASP.NET MVC, где страницей по умолчанию должен быть index.html, который является реальным файлом на диске.

Я могу перейти к файлу с помощью www.mydomain.com/index.html, чтобы знать, что он будет обработан и существует, но если я использую www.mydomain.com, я получу 404.

Я гарантировал, что документ по умолчанию правильно установлен в IIS7, и я даже зашел так далеко, что закомментировал все маршруты, определенные в моем global.asax, чтобы убедиться, что у меня нет маршрута, вызывающего эту проблему. *

Итак, подведем итог:

  • У меня есть файл index.html на диске, и IIS7 настроен на использование index.html в качестве документа по умолчанию.
  • Если я удаляю приложение ASP.NET MVC и оставляю файл index.html, который, как и ожидалось, используется в качестве документа по умолчанию.
  • Если я опубликую свое приложение ASP.NET MVC, то index.html не будет обслуживаться по умолчанию.

Кто-нибудь знает, как заставить ASP.NET MVC обслуживать документ по умолчанию?

Ответы [ 6 ]

28 голосов
/ 03 июля 2011

ASP.Net MVC маршрутизация управляется файлами Global.asax / Global.asax.cs. Стандартная маршрутизация выглядит следующим образом:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
}

Когда путь не указан, т.е. www.domain.tld/, маршрут - пустая строка, "". Поэтому при маршрутизации выполняется поиск контроллера с таким именем. Другими словами, он ищет контроллер без имени вообще. Когда он не находит такого контроллера, он отображает страницу ошибки 404 NOT FOUND.

Чтобы решить эту проблему, либо сопоставьте этот путь с чем-то значимым, либо полностью игнорируйте этот маршрут, передав управление файлу index.html:

routes.IgnoreRoute("");
2 голосов
/ 05 апреля 2014

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

И у этой проблемы была похожая проблема. причиной моей проблемы было то, что пул приложений для сайта был настроен на использование .NET Framework v2 и должен был быть установлен на v4. как только я изменил что загрузился правильно.

2 голосов
/ 01 июня 2011

У меня была похожая проблема с приложением WebForms. В вашем файле web.config убедитесь, что атрибут resourceType обработчика StaticFile в system.webServer имеет значение Either.

<add name="StaticFile" path="*" verb="*" type="" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" scriptProcessor="" resourceType="Either" ...
2 голосов
/ 22 июля 2010

Я нашел способ обойти это. Если вы хотите, чтобы index.html находился в корне вашего приложения MVC (т.е. рядом с папками controller / model / view / appdata и т. Д.), Вы можете сделать это:

Скажем, у вас есть home.html, aboutus.html и contactus.html.

//this route matches (http://mydomain.com/somekindofstring)

routes.MapRoute(
    "SingleRootArg",
    "{id}",
    new { controller = "Home", action = "Details", id=""});

// so now that you have your route for all those random strings. 
// I had to do this for vanity urls. mydomain.com/ronburgandy  etc. however, 
// mydomain.com/index.html will also come in just how you'd expect. 

//Just an example of what you COULD do. the user would see it as root html. 

Public ActionResult Details(string id)
{

    //let me save you the trouble - favicon really comes in as a string *ANGER*
    if(String.IsNullOrEmpty(id) || id.ToLower().Contains("favicon.ico"))
        return Redirect("~/index.html");
    if(id == "aboutus.html")
        return Redirect("~/aboutus.html");
    if(id == "contactus.html")
        return Redirect("~/contactus.html");
    if(id == "index.html")
        return Redirect("~/index.html");
}

index.html aboutus.html index.html теперь находятся на том же уровне, что и мой файл CSPROJ.

1 голос
/ 22 июля 2010

Вы можете игнорировать маршрут в приложении MVC и разрешить IIS его обслуживать.

routes.IgnoreRoute("index.html")
etc
0 голосов
/ 11 марта 2010

Я подозреваю, что вы добавили index.html самостоятельно, так как это расширение будет неизвестно фреймворку mvc.

Ваша страница индекса по умолчанию в mvc - это // домен / дом / индекс и физически index.aspx.

Если вы вызываете свой домен, используя // домен, то механизм маршрутизации примет /home/index.aspx, а не index.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...