gpt4 book ai didi

c# - 从 ASP.NET Core 中的 ExceptionFilterAttribute 访问 Controller

转载 作者:太空狗 更新时间:2023-10-29 20:35:55 27 4
gpt4 key购买 nike

使用 ASP.Net Core 2,您如何访问应用了 ExceptionFilterAttribute 的 Controller 实例?

现在在 Core 中是否有更好的方法来实现共享的“基本” Controller 属性和方法等?比如放到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();
}
}

最佳答案

HttpContext在 ASP.Net Core 中包含 Items IDictionary<object, object>的属性(property)在请求范围内共享数据的类型。这正是您处理案件所需要的。这是一个示例实现:

public class ApiExceptionAttribute : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
var items = context.HttpContext.Items;
if (items.ContainsKey("Tracking"))
{
Tracking tracking = (Tracking)items["Tracking"];
tracking.Exception(context.Exception, true);
}

base.OnException(context);
}
}

public class ApiTrackingAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
var tracking = new Tracking();
//...add info to tracking

context.HttpContext.Items.Add("Tracking", tracking);
}

public override void OnActionExecuted(ActionExecutedContext context)
{
var items = context.HttpContext.Items;
if (items.ContainsKey("Tracking"))
{
Tracking tracking = (Tracking) items["Tracking"];
tracking.Save();
}
}
}

关于c# - 从 ASP.NET Core 中的 ExceptionFilterAttribute 访问 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47898410/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com