0

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

现在我面临的问题之一是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);
4

1 回答 1

0

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

  • 过滤器配置文件
  • 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

它曾经是这样的如何让 ELMAH 与 ASP.NET MVC [HandleError] 属性一起工作?但现在根据这个博客它已经改变了:

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

这现在似乎在 Web.Config 中将自己注册为 managedHandler,因此您的代码不需要直接引用 Elmah。

于 2012-10-18T12:29:47.873 回答