Asp.net web api 如何使用ASP.NET Web API设置Elmah

Asp.net web api 如何使用ASP.NET Web API设置Elmah,asp.net-web-api,elmah,Asp.net Web Api,Elmah,我尝试过很多elmah Nuget,但它们不能与ASP.NET Web API一起使用。有人知道为什么吗?有什么解决办法吗?一个选项是设置一个自定义ExceptionFilterAttribute,重写OneException方法,并从中向Elmah发送信号。请参见下面的示例链接 对于ASP.NET Web API,请使用nuget软件包,详细信息如下所示 摘自: 什么是艾玛? ELMAH是一个开源项目,其目的是记录和报告ASP.NET web应用程序中未处理的异常 为什么要使用Elmah? E

我尝试过很多elmah Nuget,但它们不能与ASP.NET Web API一起使用。有人知道为什么吗?有什么解决办法吗?

一个选项是设置一个自定义ExceptionFilterAttribute,重写OneException方法,并从中向Elmah发送信号。请参见下面的示例链接


对于ASP.NET Web API,请使用nuget软件包,详细信息如下所示

摘自:

什么是艾玛?

ELMAH是一个开源项目,其目的是记录和报告ASP.NET web应用程序中未处理的异常

为什么要使用Elmah?

ELMAH充当未经处理的ASP.NET异常的不引人注目的拦截器,这些异常通常在ASP.NET中显示

现在我们知道了使用Elmah的内容和原因,让我们快速开始了解如何在ASP.NET MVC项目中使用Elmah

步骤1:右键单击解决方案并选择“管理Nuget软件包”选项

步骤2:在Nuget软件包管理器中搜索“Elmah”并安装Nuget扩展。 Nuget软件包管理器将下载并添加所需的DLL,并修改web.config的

希望这有帮助:)

进一步阅读:


查看下面的URL,它详细描述了如何将elmah与Web API结合使用:

您还可以使用下面的NuGet软件包:

Install-Package Elmah.Contrib.WebApi
用法:

只需在应用程序启动时注册它,或者逐个控制器注册

受保护的无效应用程序\u Start()
{
GlobalConfiguration.Configuration.Filters.Add(新的ElmaHandleErrorRapiAttribute());
...
}

(from)

使用ELMAH捕获WEB API中的异常有两个选项

如果您希望捕获在操作和控制器中遇到的错误,即在业务逻辑中,您可以创建ActionFilterAttribute并将这些异常记录到ELMAH

例如:

公共类未处理的ExceptionFilter:ExceptionFilterAttribute{
public override void OnException(HttpActionExecutedContext上下文){
GetDefault(HttpContext.Current.Log)(new Elmah.Error(context.Exception));
}
}
然后,通过添加该过滤器进行连接

公共静态类WebApiConfig{
公共静态无效寄存器(HttpConfiguration配置){
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
添加(新的未处理的ExceptionFilter());
}
}
使用上述方法,将不会处理以下错误:

  • 从控制器构造函数引发的异常
  • 从消息处理程序引发的异常
  • 路由过程中引发的异常
  • 响应内容序列化期间引发的异常
参考:&

为了让ELMAH在全局级别记录WEB API错误,以便捕获所有500个服务器错误,请执行以下操作:

安装nuget:

将以下内容添加到WebApiConfig

公共静态类WebApiConfig
{
公共静态无效寄存器(HttpConfiguration配置)
{
...
Add(typeof(IEExceptionLogger),new-ElmahExceptionLogger());
...
}
}
如果要显示500个服务器错误的自定义错误消息,可以在Web Api中实现新的ExceptionHandler(注意ExceptionLogger和ExceptionHandler是不同的)

类OopsExceptionHandler:ExceptionHandler
{
公共覆盖无效HandleCore(例外HandlerContext上下文)
{
context.Result=新的TextPlainErrorResult
{
请求=context.ExceptionContext.Request,
Content=“噢!对不起!出了点问题。”+
“请联系support@contoso.com所以我们可以试着修复它。”
};
}
私有类TextPlainErrorResult:IHttpActionResult
{
公共HttpRequestMessage请求{get;set;}
公共字符串内容{get;set;}
公共任务执行同步(CancellationToken CancellationToken)
{
HttpResponseMessage响应=
新的HttpResponseMessage(HttpStatusCode.InternalServerError);
response.Content=新的StringContent(Content);
response.RequestMessage=请求;
返回Task.FromResult(响应);
}
}
}

参考资料:

我一直在努力解决的问题(但仍然没有找到解决的时间)是在我的elmah access上混合使用表单身份验证和Api上的基本身份验证,您是否从
ApicController生成404?如果不是,而且它是一个标准的MVC控制器,那么你就完全错过了问题的关键。从一个普通的控制器生成404,这只是一个例子,如果我使用webapi控制器并生成404,情况也会如此。你真的尝试过吗?因为我很确定事实并非如此。异常处理在Web API中的工作方式不同。@Doozer1979说是谁?你只需要注册你的
HttpFilters
这里是如何做好的,那么为什么不把这部分作为你的答案,而不是留下一些对OP的问题不起作用的东西。谢谢,伙计,这很有帮助。我还在挠头,直到我找到了在我的情况下如何工作的方法(WebApi也在MVC站点的上下文中运行);答案就是简单地安装Elmah.MVC包。我在这里的博客文章中对此稍作扩展:第一个直接调用
Elmah.ErrorLog.GetDefault(HttpContext.Current.Log
的(简单的)解决方案工作正常,但它不发送电子邮件(如果你已经设置了Elmah的话)——它只是记录。如果你想