Web API路由捕获丢失的控制器

时间:2015-09-24 09:44:24

标签: c# .net asp.net-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非常重要,否则此更改将需要进行一些更改,并且(特别是)与前端开发人员进行不必要的通信。

怎么办?

2 个答案:

答案 0 :(得分:2)

快速解决方案,手动列出您的控制器路线,然后捕获与缺失路线的不匹配。

但是,我认为最好的解决方案是使用异常处理程序

捕获缺少的控制器异常

http://www.asp.net/web-api/overview/error-handling/exception-handling

答案 1 :(得分:1)

您可以尝试其他答案中提到的异常处理程序,或者您可以捕获api特定404 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。