【发布时间】:2018-08-09 05:48:51
【问题描述】:
使用 ASP.Net Core 2,如何访问应用了 ExceptionFilterAttribute 的 Controller 实例?
现在在 Core 中是否有更好的方法来实现共享的“基本”控制器属性和方法等?比如放到Startup之类的更高层次?
在 Core 之前,在 MVC 4 中,我会做这样的事情:
/// <summary>
/// Base controller, shared by all WebAPI controllers for tracking and shared properties.
/// </summary>
[ApiTracking]
[ApiException]
public class BaseApiController : ApiController
{
private Common.Models.Tracking _Tracking = null;
public Common.Models.Tracking Tracking
{
get
{
if(_Tracking == null)
_Tracking = new Common.Models.Tracking();
return _Tracking;
}
}
//... other shared properties...
}
/// <summary>
/// Error handler for webapi calls. Adds tracking to base controller.
/// </summary>
public class ApiExceptionAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext cntxt)
{
BaseApiController ctrl = cntxt.ActionContext.ControllerContext.Controller as BaseApiController;
if (ctrl != null)
ctrl.Tracking.Exception(cntxt.Exception, true);
base.OnException(actionExecutedContext);
}
}
/// <summary>
/// Intercepts all requests to inject tracking detail and call tracking.save.
/// </summary>
public class ApiTrackingAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext cntxt)
{
//...add info to tracking
}
public override void OnActionExecuted(HttpActionExecutedContext cntxt)
{
BaseApiController ctrl = cntxt.ActionContext.ControllerContext.Controller as BaseApiController;
if (ctrl != null)
ctrl.Tracking.Save();
}
}
【问题讨论】:
-
您从未真正必须使用基本控制器来将属性应用到所有控制器。 It's different in core, but you still can apply attributes without a base controller.
-
@ErikPhilips 您提供的链接显示了如何添加全局过滤器,但这里的问题是我们如何在过滤器中获取控制器上下文
-
@programtreasures 我明白了。这就是为什么我的信息是评论而不是答案。
标签: c# asp.net-core