全局错误登录ASP.Net MVC 6
|
我正在测试一个MVC 6 Web Api,并希望实现登录到一个全局错误处理程序.只要保证没有错误就会退出系统而不记录.我创建了一个ExceptionFilterAttribute,并在启动时将其全局添加: public class AppExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
//Notice pulling from HttpContext Application Svcs -- don't like that
var loggerFactory = (ILoggerFactory)context.HttpContext.ApplicationServices.GetService(typeof (ILoggerFactory));
var logger = loggerFactory.Create("MyWeb.Web.Api");
logger.WriteError(2,"Error Occurred",context.Exception);
context.Result = new JsonResult(
new
{
context.Exception.Message,context.Exception.StackTrace
});
}
}
现在在启动时,我添加了这个过滤器: services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new AppExceptionFilterAttribute());
});
这一切似乎是一种暴力…有更好的方式来到这里使用MVC 6? 我不喜欢的东西,或者不了解这种方法: >不喜欢从http上下文拉DI 我可以想到的另一个选择是拥有一个基本控制器,它接受所有控制器继承的ILoggerFactory. 想知道是否有某种诊断中间件允许插入日志记录? 解决方法你的问题有2部分. 1)DI可注射过滤器2)全局错误处理.关于#1:您可以使用ServiceFilterAttribute用于此目的. //Modify your filter to be like this to get the logger factory DI injectable.
public class AppExceptionFilterAttribute : ExceptionFilterAttribute
{
private readonly ILogger _logger;
public AppExceptionFilterAttribute(ILoggerFactory loggerfactory)
{
_logger = loggerFactory.CreateLogger<AppExceptionFilterAttribute>();
}
public override void OnException(ExceptionContext context)
{
//...
}
}
//Register your filter as a service (Note this filter need not be an attribute as such) services.AddTransient<AppExceptionFilterAttribute>(); //On the controller/action where you want to apply this filter,//decorate them like
[ServiceFilter(typeof(AppExceptionFilterAttribute))]
public class HomeController : Controller
{
....
}
您应该能够从传递的ExceptionContext获取控制器的详细信息. 关于#2:从你以前的帖子看起来像是在使用ExceptionHandlerMiddleware(source& extension source)…如何使用它?…有关的一些信息: >这个中间件是通用的,适用于任何中间件在它之后注册了所有任何概念,如控制器/动作信息是特定于MVC的,该中间件不会知道.>这个中间件不处理格式化程序写入异常.你可以编写自己的缓冲中间件,您可以在其中修改响应身体成为缓冲流(MemoryStream)并让MVC层写回应.在格式化程序写入异常的情况下,您可以抓住它并发送一个500错误响应与细节. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何用ASP.NET MVC命令查询责任分离(CQRS)?
- asp.net-mvc – Razor中()(括号)和{}(大括号)之间的差异
- asp.net – 在同一个域上的两个网站之间共享cookie
- asp.net – 这些Web Essentials选项有什么作用?
- asp.net – LINQ to SQL – 如何选择特定的列和返回强类型列
- asp.net-mvc – “信号量超时期限已过期”SQL Azure
- ASP.NET – meta:ResourceKey vs %$Resources:MyKey%
- asp.net – 使用回发解析.Net页面
- 实体框架 – EF Codefirst和RDLC Reports
- asp.net – 动态列在回发后消失
- asp.net – 如何从TableAdapter中检索存储过程返
- asp.net-mvc-3 – 分页/排序不适用于部分视图中使
- asp.net-mvc – 在MVC WebApi中的方法如何映射到
- 在我的应用程序中托管ASP.NET
- asp.net-core – 是否可以将NoSQL用于Identity S
- asp.net – CookieAuthenticationOptions.Authen
- asp.net – 如何停止所有cassini实例?
- asp.net – 如何使用AspNetSqlMembershipProvide
- 文档在线预览的实现
- asp.net-mvc – 如何使用“?”路由查询字符串以
