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>
发生。如何捕获此错误?
答案 0 :(得分:4)
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",
routeTemplate: "api/{controller}/{id}",
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());
}