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()); }