如何在ASP.NET MVC4 Web API中捕获未定义的api方法调用

ASP.NET / Mono MVC4 Web API v.1应用程序.

如何捕获未定义的api方法的调用.
调用http:// localhost:52216 / erp / api / undefinedmethod会向浏览器返回错误:

<Error>
<Message>
No HTTP resource was found that matches the request URI 'http:// localhost:52216/erp/api/undefinedmethod'.
</Message>
<MessageDetail>
No type was found that matches the controller named 'undefinedmethod'.
</MessageDetail>
</Error>

如何捕获此错误以记录到数据库?
我试过问题的代码

How do I log ALL exceptions globally for a C# MVC4 WebAPI app?

但是仍然没有执行Application_Error和异常过滤器代码,返回错误
浏览器.
如何捕获此错误?

如果url没有api之类的话

'http://localhost:52216/erp/undefinedmethod'

Application_Error正确执行.

使用VS2013 WebAPI项目模板的WebAPI配置:

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

 }

更新

我尝试改变了答案.
API控制器使用表单授权,并使用标准[授权]进行修饰
属性.
如果授权失败,则标准xml api错误消息

<Error>
<Message>Authorization has been denied for this request.</Message>
</Error>

发生.如何捕获此错误呢?

解决方法

Imran Baloch撰写了一篇关于如何实现这一目标的文章.基本上你需要创建自己的HttpControllerSelector和HttpActionSelector. You can find the article here.

编辑:

如果您的应用程序使用的路径不是WebApiConfig中注册的路由,则需要对路由进行一些更改.不是在Register方法的末尾定义Error404路由,而是定义一个新方法(RegisterNotFound)来注册路由:

public static class WebApiConfig
{    
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",defaults: new { id = RouteParameter.Optional }
        );
    }

    public static void RegisterNotFound(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "Error404",routeTemplate: "{*url}",defaults: new { controller = "Error",action = "Handle404" }
        );
    }
}

然后在Global.asax寄存器中调用此方法:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    WebApiConfig.RegisterNotFound(GlobalConfiguration.Configuration);


    GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector),new HttpNotFoundAwareDefaultHttpControllerSelector(GlobalConfiguration.Configuration));
    GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpActionSelector),new HttpNotFoundAwareControllerActionSelector());

}

相关文章

引言 本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个...
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要...
一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道...
背景 在.Net和C#中运行异步代码相当简单,因为我们有时候需要...
HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authenticatio...
1.Linq 执行多列排序 OrderBy的意义是按照指定顺序排序,连续...