我尝试了许多 elmah nuget,但它们不适用于 ASP.NET Web API。有人知道为什么吗?有什么解决办法吗?
4 回答
使用 ELMAH 在 WEB API 中捕获异常有两种选择。
如果您想捕获在 Actions 和 Controllers 中遇到的错误,即在您的业务逻辑中,您可以创建一个 ActionFilterAttribute 并将这些异常记录到 ELMAH。
例子:
public class UnhandledExceptionFilter : ExceptionFilterAttribute {
public override void OnException(HttpActionExecutedContext context) {
Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(context.Exception));
}
}
然后通过添加该过滤器进行接线。
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Filters.Add(new UnhandledExceptionFilter());
}
}
使用上述方法将不会处理以下错误:
- 控制器构造函数抛出的异常。
- 消息处理程序抛出的异常。
- 路由期间抛出的异常。
- 响应内容序列化过程中抛出的异常
参考: http: //blogs.msdn.com/b/webdev/archive/2012/11/16/capturing-unhandled-exceptions-in-asp-net-web-api-s-with-elmah.aspx & http: //www.asp.net/web-api/overview/error-handling/web-api-global-error-handling
为了让 ELMAH在全局级别记录 WEB API 错误,以便捕获所有 500 个服务器错误,请执行以下操作:
安装 nuget:https ://www.nuget.org/packages/Elmah.Contrib.WebApi/
将以下内容添加到 WebApiConfig
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
...
config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger());
...
}
}
如果您想为 500 服务器错误显示自定义错误消息,您可以在 Web Api 中实现新的 ExceptionHandler(注意 ExceptionLogger 和 ExceptionHandler 是不同的。)
class OopsExceptionHandler : ExceptionHandler
{
public override void HandleCore(ExceptionHandlerContext context)
{
context.Result = new TextPlainErrorResult
{
Request = context.ExceptionContext.Request,
Content = "Oops! Sorry! Something went wrong." +
"Please contact support@contoso.com so we can try to fix it."
};
}
private class TextPlainErrorResult : IHttpActionResult
{
public HttpRequestMessage Request { get; set; }
public string Content { get; set; }
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
HttpResponseMessage response =
new HttpResponseMessage(HttpStatusCode.InternalServerError);
response.Content = new StringContent(Content);
response.RequestMessage = Request;
return Task.FromResult(response);
}
}
}
参考:http ://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling
一种选择是设置自定义 ExceptionFilterAttribute,覆盖 OnException 方法,并从那里向 Elmah 发出信号。请参阅下面的示例链接
检查以下 URL,它详细描述了如何将 elmah 与 Web API 一起使用:
您还可以使用下面的 NuGet 包:
Install-Package Elmah.Contrib.WebApi
用法:
只需在应用程序启动期间或逐个控制器注册它。
protected void Application_Start() { GlobalConfiguration.Configuration.Filters.Add(new ElmahHandleErrorApiAttribute()); ... }
对于 ASP.NET Web API,使用 Elmah.MVC nuget 包,详细信息如下
摘自:如何使用 ASP.NET MVC 4 设置 ELMAH.MVC?
什么是艾尔玛?
ELMAH 是一个开源项目,其目的是记录和报告 ASP.NET Web 应用程序中未处理的异常。
为什么要使用 Elmah ?
ELMAH 充当未处理的 ASP.NET 异常的不显眼拦截器,这些异常通常以 ASP.NET黄屏死机显示。
所以现在我们知道什么以及为什么要使用 Elmah,让我们快速开始了解如何在您的 ASP.NET MVC 项目中使用 Elmah。
第 1 步:右键单击您的解决方案并选择“管理 Nuget 包”选项
第 2 步:在 Nuget 包管理器中搜索“Elmah”并安装Elmah.MVC nuget 扩展。
Nuget 包管理器将下载并添加所需的 dll 并修改 web.config<appSetting>
以供 Elmah 工作。
第3步:就是这样!您的 Elmah 现在已准备好进行测试。我生成了一个 404 来测试我的 Elmah 是否有效,ELMAH 可以通过这个 url 访问:http: //yourapp.com/elmah。
希望这可以帮助 :)
延伸阅读: