2015-09-24 18 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