2013-04-18 3 views
1

J'ai un projet Web API assez straight-forward qui a la route suivante sous la route par défaut dans WebApiConfig.cs:API Web ressource imbriquée ne sous IIS8

config.Routes.MapHttpRoute(
    name: "ChildApi", 
    routeTemplate: "api/{parentController}/{parentId}/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

Cela fonctionne bien en marche sous le serveur de développement VS2012 et la navigation vers mon URI de test (/api/team/1/entries/2013-04-19) renvoie les résultats corrects. Une fois que je publie cela et tenter d'accéder au même URI à l'aide IIS8, je reçois les éléments suivants erreur 404:

HTTP Error 404.0 - Not Found 
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable. 

Most likely causes: 
The directory or file specified does not exist on the Web server. 
The URL contains a typographical error. 
A custom filter or module, such as URLScan, restricts access to the file. 

Things you can try: 
Create the content on the Web server. 
Review the browser URL. 
Create a tracing rule to track failed requests for this HTTP status code and see which module is calling SetStatus. For more information about creating a tracing rule for failed requests, click here. 

Detailed Error Information: 
Module  IIS Web Core 
Notification  MapRequestHandler 
Handler StaticFile 
Error Code  0x80070002 

Tous les itinéraires non imbriqués (par exemple /api/team/1) fonctionnent très bien, mais il semble que cette voie particulière est interprétée comme un fichier statique et IIS tente de le servir en tant que tel? Est-ce que quelqu'un d'autre a déjà vu/résolu ce problème auparavant?

Répondre

1

Ok, donc c'est embarrassant ...

Je mets ma route en WebApiConfig.cs comme ceci:

config.Routes.MapHttpRoute(
    name: "ChildApi", 
    routeTemplate: "api/{parentController}/{parentId}/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

J'ai alors d'ajouter mon projet publié à IIS sous le nom de l'application "api". Cela (maintenant évidemment) signifie que l'URL que j'aurais dû utiliser est /api/api/team/1/entries/2013-04-19.

Changer ma route comme suit maintenant résolu mon problème:

config.Routes.MapHttpRoute(
    name: "ChildApi", 
    routeTemplate: "{parentController}/{parentId}/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

Je pense que la confusion a été causée par le fait que cette route fonctionne très bien en mode débogage (comme si les bandes de serveur de développement VS2012 la première /api de l'URL).

Questions connexes