2013-04-18 2 views
1

У меня есть довольно прямо вперед API проекта Web, который имеет следующий маршрут по умолчанию на маршруте в WebApiConfig.cs:Web API вложенных ресурсов неудачу под IIS8

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

Это отлично работает под управлением операционной системы на сервере разработки VS2012 и переход к моему тестовому URI (/api/team/1/entries/2013-04-19) возвращает правильные результаты. После того, как я публикую это и пытается получить доступ к той же URI, используя IIS8, я получаю следующее сообщение об ошибке 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 

Все невложенных маршруты (например, /api/team/1) работают нормально, но мне кажется, что именно этот маршрут интерпретируется как статический файл, и IIS пытается его обслуживать как таковой? Кто-нибудь еще видел/разрешал эту проблему раньше?

ответ

1

Итак, это неудобно ...

Я установил свой маршрут в WebApiConfig.cs так:

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

Затем я приступил к добавить свой опубликованный проект IIS под именем приложения «апи». Это (теперь очевидно) означает, что URL, который я должен был использовать, - /api/api/team/1/entries/2013-04-19.

Изменение моего маршрута следующим образом, как теперь решить мой вопрос:

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

Я думаю, что путаница была вызвана тем, что этот маршрут отлично работает в режиме отладки (как если сервер разработки VS2012 полоска первого /api из URL-адреса).