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

本文关键字:Web API 路由 控制器 失控 | 更新日期: 2023-09-27 18:14:25

我有一堆控制器在我的应用程序是由默认的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,否则这个更改将需要一些更改和(特别是)与前端开发人员不必要的通信。

该怎么办?

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

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

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

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

捕获丢失的控制器异常http://www.asp.net/web-api/overview/error-handling/exception-handling