2015-09-24 34 views
2

我有一堆控制器在我的應用程序中由默認web api路由處理。現在我試圖處理控制器尚不存在的情況,但我真的對它的名字感興趣。Web API路由捕獲缺失的控制器

所有現有的和未來的控制器將具有相同的航線結構

api/{controller}/{id} 

有沒有辦法捕捉到不存在的控制器的名稱,而不妨礙由控制器類型名稱進行默​​認路由的API。

我目前的配置:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "Default Api", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

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

當安排好了這個順序MissingController永遠不會在運行時創建。如果我重新排列路線,實際的控制器將不會被創建。

對於我來說遺漏URL和現有控制器的URL是很重要的,否則這個改變將需要一些改變和(特別是)與前端開發人員的不必要的通信。

怎麼辦?

+0

你的「Missing Api」路線永遠不會被擊中! –

回答

1

在對方的回答中提到,您可以嘗試使用異常處理程序,或者您也可以捕獲特定api404 Resource not found錯誤並將它們重定向到缺少的控制器。

要做到這一點,添加以下的自定義錯誤模塊中web.config

<location path="api"> 
    <system.webServer> 
     <httpErrors errorMode="Custom" existingResponse="Replace"> 
      <remove statusCode="404" /> 
      <error statusCode="404" responseMode="ExecuteURL" path="/api/Missing" /> 
     </httpErrors> 
    </system.webServer> 
</location> 

注意:您可能需要做一個IISRESET。

+1

這個問題解決了我的問題。在這種情況下,你不想惹Web.config有一些辦法: 1)舊的:http://weblogs.asp.net/imranbaloch/handling-http-404-error-in-asp-net-web- api 2)較新:http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling – v00d00