从WCF WebApi迁移到MVC4 Api - 注册全局错误处理程序

时间:2012-10-18 10:23:44

标签: wcf asp.net-web-api wcf-web-api

我正在将使用WebApi Preview 5(当它是WCF的一部分)开发的项目迁移到WebApi的最终版本(MVC4的一部分)。有一个document描述了这个过程,但它非常简单,并没有涵盖大部分问题。

现在我面临的一个问题是 GlobalErrorHandler 是通过继承 HttpErrorHandler 然后重写 OnTryProvideResponse 而创建的与Elmah挂钩错误处理。现在已经在AppStart上注册了这样一行:

var configuration = new WebApiConfiguration();
//some other configuration for security and CreateInstance
configuration.ErrorHandlers = 
(handlers, endpoint, description) => handlers.Add(new GlobalErrorHandler())
};
//then some registration
RouteTable.Routes.MapServiceRoute<SomeObject>("routeName", configuration);

然后将不同的路由映射到此配置。所有这些代码在MVC4 WebApi的新世界中都不起作用,似乎 HttpErrorHandler 之间存在冲突,它甚至无法正确实现其成员。

现在我已经看到有关如何使用WebApi注册Elmah的一般帖子,但我试图尽可能地坚持原始代码,我假设 - 可能是我错了 - 有一个直接相当于什么微软已经在预览版中以及他们在最后一个版本中发布了什么。所以我的问题:

  1. ASP.NET MVC4 WebApi中此全局错误处理注册的等效内容是什么?
  2. 我是否需要按照此处的方式进行配置(默认的webapi示例项目似乎没有类似的代码)
  3. 该路由注册代码行的等价物:RouteTable.Routes.MapServiceRoute(“routeName”,configuration);

1 个答案:

答案 0 :(得分:0)

如果在Visual Studio中创建一个快速的一次性WebApi MVC项目,您将看到一个App_Start文件夹,其中包含一些具有处理注册的静态方法的类,具体来说:

  • FilterConfig.cs
  • WebApiConfig.cs

WebApi Config是您需要注册路线等的地方......

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 class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
}

Global.asax调用这些静态注册脚本,如下所示:

 protected void Application_Start()
    {

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

    }

关于Elmah,看起来简单,包括Nuget包将注册它......

寻找包Elmah.Mvc

PM> Install-Package Elmah.MVC

它过去就像这个How to get ELMAH to work with ASP.NET MVC [HandleError] attribute?但现在根据这个blog它已经改变了:

  

HandleErrorAttribute inside如果你试图在ASP.NET MVC中使用ELMAH,   你可能实现了自己的HandleErrorAttribute,就像它一样   在这个例子中显示。您不再需要应用此自定义代码   与Elmah.MVC。一旦你安装了包,所以可以安全地删除   你的HandleError属性,因为它已经包含在包中了。

现在看来,它在Web.Config中注册为managedHandler,因此您的代码不需要直接引用Elmah。