2010-03-11 21 views
21

Tengo una aplicación ASP.NET MVC donde la página predeterminada debe ser index.html que es un archivo real en el disco.ASP.NET MVC no sirve el documento predeterminado

puedo buscar el archivo usando www.mydomain.com/index.html así que sé que será servida y existe pero si uso www.mydomain.com consigo un 404.

he asegurado que el documento predeterminado está configurado correctamente en IIS7 e incluso he comentado todas las rutas definidas en mi archivo global.asax para asegurarme de que no haya una ruta que cause este problema.

Para resumir:

  • Tengo un archivo index.html en el disco y IIS7 está configurado para utilizar index.html como documento predeterminado.
  • Si elimino mi aplicación ASP.NET MVC y dejo el archivo index.html se sirve como el documento predeterminado como se esperaba.
  • Si publico mi aplicación ASP.NET MVC, el archivo index.html no se publica por defecto.

¿Alguien sabe cómo obtener ASP.NET MVC para que sirva el documento predeterminado?

+0

quizás obtendría una mejor respuesta en serverfault.com – tzenes

+0

Esto no es un problema de IIS7, es un problema de ASP.NET MVC. El documento predeterminado se sirve perfectamente cuando no se utiliza ASP.NET MVC –

+0

Estoy realmente confundido por qué esto tendría que hacerse –

Respuesta

-3

Sospecho que ha agregado index.html usted mismo, ya que esa extensión sería desconocida para mvc framework.

Su página de índice predeterminada en mvc es // domain/home/index y es físicamente index.aspx.

Si llama a su dominio usando // dominio, el motor de enrutamiento asumirá /home/index.aspx y no index.html.

+0

El motor de enrutamiento no enrutará a la acción de índice en el controlador de inicio porque, como he dicho, he comentado toda la ruta en mi archivo global.asax. Hay un archivo index.html en el disco e IIS7 está configurado para usar index.html como el documento predeterminado, pero ASP.NET MVC impide esto de alguna manera –

2

Encontré una forma de evitar esto. Si quieres index.html estar en la raíz de la aplicación MVC (es decir, al lado de su controlador/modelo/vista/appdata etc carpetas), usted puede hacer esto:

Digamos que tiene home.html, aboutus.html y 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.htmlaboutus.htmlindex.html están ahora al mismo nivel que mi archivo csproj.

1

Puede ignorar la ruta en su aplicación MVC y dejar que IIS la sirva.

routes.IgnoreRoute("index.html") 
etc 
+3

Desafortunadamente esto no funciona para un "documento predeterminado" porque el usuario está no escribiendo index.html en la dirección. Si vas directamente a index.html, esto funciona. – mkchandler

+0

@ mc2thaH Deberá cambiar la configuración del "documento predeterminado" en IIS de default.aspx a index.html. El OP dijo que hizo esto. – tarn

+1

mkchandler es correcto, incluso con el conjunto de documentos predeterminado, no funcionó para mí. En cambio, tuve que agregar routes.IgnoreRoute ("") – pius

2

Tuve un problema similar con una aplicación WebForms. En su web.config, asegúrese de que el atributo resourceType del controlador StaticFile en system.webServer esté configurado en Either.

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

El método 'routes.IgnoreRoute (" ");' no funcionó para mí. Esto hizo. Gracias. –

+0

Pude usar esto con Orchard para que funcione el documento predeterminado. Agregar DefaultDocumentModule y tener resourceType = "Either" fue la clave. James

27

ASP.Net MVC enrutamiento es controlado por los archivos Global.asax/Global.asax.cs. El enrutamiento listo para usar tiene este aspecto:

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 
     ); 
} 

Cuando no se especifica ninguna ruta, es decir. www.domain.tld/, la ruta es la cadena vacía, "". Por lo tanto, el enrutamiento busca un controlador con ese nombre. En otras palabras, busca un controlador sin nombre. Cuando no encuentra dicho controlador, muestra una página de error 404 NOT FOUND.

Para resolver el problema, ya sea mapa que camino a algo significativo o bien ignorar esa ruta en su totalidad, pasando el control al archivo index.html:

routes.IgnoreRoute(""); 
+0

"Por lo tanto, el enrutamiento busca un controlador con ese nombre. En otras palabras, busca un controlador sin nombre ". - en realidad, está buscando Inicio/Índice - esos son los parámetros predeterminados en la llamada MapRoute –

2

Lo siento por la resurrección de esta momia, pero yo no' Creo que este problema siempre fue un problema de documento predeterminado. De hecho, es probable que no desee tener un documento predeterminado establecido como muchos de los otros contestadores han indicado.

También tuve este problema, un problema similar. La causa de mi problema fue que el grupo de aplicaciones para el sitio estaba configurado para usar .NET Framework v2 y debería haber sido configurado para v4. una vez que cambié eso se cargó correctamente.

Cuestiones relacionadas