2010-03-11 5 views
21

J'ai une application ASP.NET MVC où la page par défaut doit être index.html qui est un fichier réel sur le disque.ASP.NET MVC ne sert pas le document par défaut

je peux accéder au fichier en utilisant www.mydomain.com/index.html donc je sais que ce sera servi et EXISTE mais si je l'utilise www.mydomain.com je reçois un 404.

Je me suis assuré que le document par défaut est correctement défini dans IIS7 et je suis même allé jusqu'à commenter toutes les routes définies dans mon global.asax pour m'assurer que je n'ai pas de route à l'origine de ce problème.

Donc, pour résumer:

  • J'ai un fichier index.html sur le disque et IIS7 est configuré pour utiliser index.html comme document par défaut.
  • Si je supprime mon application ASP.NET MVC et laisse le fichier index.html est servi comme le document par défaut comme prévu.
  • Si je publie mon application ASP.NET MVC, le fichier index.html n'est pas traité par défaut.

Est-ce que quelqu'un sait comment obtenir ASP.NET MVC pour servir le document par défaut?

+0

peut-être vous obtiendrez une meilleure réponse sur serverfault.com – tzenes

+0

Ce n'est pas un problème IIS7 c'est un problème ASP.NET MVC. Le document par défaut est servi parfaitement lorsque vous n'utilisez pas ASP.NET MVC –

+0

Je suis en fait confus pourquoi cela devrait être fait –

Répondre

-3

Je suppose que vous avez ajouté vous-même index.html car cette extension serait inconnue du framework mvc.

Votre page d'index par défaut dans mvc est // domain/home/index et est physiquement index.aspx. Si vous appelez votre domaine à l'aide de // domain, le moteur de routage assumera /home/index.aspx et non index.html.

+0

Le moteur de routage ne sera pas routé vers l'action d'index sur le contrôleur de la maison parce que comme je l'ai dit j'ai commenté toute la route dans mon global.asax. Il existe un fichier index.html sur le disque et IIS7 est configuré pour utiliser index.html comme document par défaut mais ASP.NET MVC empêche cela d'une manière ou d'une autre –

2

J'ai trouvé un moyen de contourner cela. Si vous voulez index.html être à la racine de votre application MVC (i.e. à côté de votre contrôleur/modèle/vue/AppData des dossiers, etc.), vous pouvez le faire:

Supposons que vous avez home.html, aboutus.html et 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 sont maintenant au même niveau que mon fichier csproj.

1

Vous pouvez ignorer l'itinéraire dans votre application MVC et laisser IIS le servir.

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

Malheureusement, cela ne fonctionne pas pour un "document par défaut" car l'utilisateur est ne pas taper index.html dans l'adresse. Si vous allez directement à index.html, cela fonctionne. – mkchandler

+0

@ mc2thaH Vous devrez modifier le paramètre "document par défaut" dans IIS de default.aspx à index.html. Le PO a dit qu'il l'a fait. – tarn

+1

mkchandler a raison, même avec le jeu de documents par défaut, cela n'a pas fonctionné pour moi. Au lieu de cela, j'ai dû ajouter routes.IgnoreRoute ("") – pius

2

J'ai eu un problème similaire avec une application WebForms. Dans votre fichier web.config, assurez-vous que l'attribut resourceType du gestionnaire StaticFile sous system.webServer est défini sur Soit.

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

La méthode 'routes.IgnoreRoute (" ");' n'a pas fonctionné pour moi. Cela a fait. Merci. –

+0

J'ai été capable de l'utiliser avec Orchard pour faire fonctionner le document par défaut. Ajout de DefaultDocumentModule et avoir resourceType = "Sither" était la clé. James

27

routage ASP.Net MVC est contrôlé par les fichiers Global.asax/Global.asax.cs. Le routage prêt à l'emploi ressemble à ceci:

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

Lorsque aucun chemin n'est spécifié, c.-à-d. www.domain.tld/, la route est la chaîne vide, "". Par conséquent, le routage recherche un contrôleur portant ce nom. En d'autres termes, il cherche un contrôleur sans nom du tout. Quand il ne trouve aucun contrôleur, il affiche une page d'erreur 404 NOT FOUND.

Pour résoudre le problème, mapper cette voie à quelque chose de significatif ou bien ignorer cette route tout à fait, passer le contrôle sur le fichier index.html:

routes.IgnoreRoute(""); 
+0

"Par conséquent, le routage recherche un En d'autres termes, il cherche un contrôleur sans nom du tout. " - En fait, il cherche Home/Index - ce sont les paramètres par défaut dans l'appel MapRoute –

2

Désolé pour ressusciter cette momie, mais je n » Je crois que cette question a toujours été un problème de document par défaut. En fait, vous ne voulez probablement pas avoir un jeu de documents par défaut comme l'ont dit beaucoup d'autres répondants.

Avait ce problème aussi, un problème similaire. la cause de mon problème était que le pool d'applications pour le site était configuré pour utiliser .NET Framework v2 et aurait dû être défini sur v4. une fois que j'ai changé cela, il a chargé correctement.

Questions connexes