【发布时间】:2012-04-24 09:17:12
【问题描述】:
我尝试了许多 elmah nuget,但它们无法与 ASP.NET Web API 一起使用。有人知道为什么吗?有什么解决办法吗?
【问题讨论】:
标签: asp.net-web-api elmah
我尝试了许多 elmah nuget,但它们无法与 ASP.NET Web API 一起使用。有人知道为什么吗?有什么解决办法吗?
【问题讨论】:
标签: asp.net-web-api elmah
在 WEB API 中使用 ELMAH 捕获异常有两种选择。
如果您想捕获 在操作和控制器中遇到的错误,即在您的业务逻辑中,您可以创建一个 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
【讨论】:
Elmah.ErrorLog.GetDefault(HttpContext.Current).Log 的第一个(简单)解决方案工作正常,但它不发送电子邮件(如果您是这样设置 Elmah 的)- 它只是记录。如果您希望 Elmah 以您在 web.config 中指定的方式处理您的异常,那么我建议将 .Log 调用替换为 Elmah.ErrorSignal.FromCurrentContext().Raise(context.Exception);,这将触发正常的 Elmah 处理。
一种选择是设置自定义 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 包,下面给出了详细信息
取自:HOW TO SETUP ELMAH.MVC WITH ASP.NET MVC 4 ?
什么是艾玛?
ELMAH 是一个开源项目,其目的是记录和报告 ASP.NET Web 应用程序中未处理的异常。
为什么要使用 Elmah ?
ELMAH 充当未处理的 ASP.NET 异常的不显眼拦截器,这些异常通常通过 ASP.NET yellow screen of death 表现出来。
现在我们知道什么以及为什么要使用 Elmah,让我们快速开始了解如何在您的 ASP.NET MVC 项目中使用 Elmah。
第 1 步: 右键单击您的解决方案并选择“管理 Nuget 包”选项
第 2 步: 在 Nuget 包管理器中搜索“Elmah”并安装 Elmah.MVC nuget 扩展。
Nuget 包管理器将下载并添加所需的 dll,并将 Elmah 的 web.config 的 <appSetting> 修改为 work。
第 3 步:就是这样!您的 Elmah 现在已准备好进行测试。我生成了一个 404 来测试我的 Elmah 是否有效,ELMAH 可以通过这个 url 访问:http://yourapp.com/elmah。
希望这会有所帮助:)
进一步阅读:
【讨论】:
ApiController 生成404 吗?如果不是,并且它是一个标准的 MVC 控制器,那么您就完全错过了问题的重点。
HttpFilters这里是如何做到的stackoverflow.com/questions/10059563/…