Подтвердить что ты не робот

ASP.NET MVC не работает по умолчанию

У меня есть приложение 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 обслуживать документ по умолчанию?

4b9b3361

Ответ 1

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

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

Скажите, что у вас есть 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.

Ответ 3

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

<add name="StaticFile" path="*" verb="*" type="" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" scriptProcessor="" resourceType="Either" ...

Ответ 4

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

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

Ответ 5

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

routes.IgnoreRoute("index.html")
etc

Ответ 6

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

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

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