我正在创建一个 ASP.NET Core Web API 项目。我想定义一个属性(例如
ExampleAttribute
)并访问其中的 HttpContext
并执行一些操作,最后在必要时返回 ObjectResult
,或继续。
我不知道我这样做是否正确,但我想以这种方式定义一个属性:
public class DeveloperTaskAttribute : Attribute
{
// using HttpContext and doing some action
// I will returning BadRequest("") if necessary
// or continue...
}
我正在尝试在此端点上使用此属性:
[HttpGet]
[ExampleAttribute] // using attribute
public IActionResult EndPoint1()
{
// doing some action in endpoint1
}
我该怎么做?
感谢您的帮助。
不要使用属性,而是使用 ActionFilter 和 Attribute。
通过ActionExecutingContext从控制器.Net Core获取自定义属性
首先定义一个属性:
[AttributeUsage(AttributeTargets.Method)]
public sealed class SampleAttribute : Attribute
{
}
然后定义一个实现 IActionFilter 的类:
public sealed class SampleActionFilter : IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context){ }
public void OnActionExecuting(ActionExecutingContext context)
{
var attrib = (context.ActionDescriptor as ControllerActionDescriptor).MethodInfo.GetCustomAttributes<SampleAttribute>().FirstOrDefault();
if (attrib is null) return;
if (!someCondition) return;
context.HttpContext.Response.StatusCode = 400;
context.Result = new ObjectResult(new { done = false });
}
}
要注册此操作过滤器:
services.AddControllers(mvcOptions => { mvcOptions.Filters.Add<SampleActionFilter>(); });
您只需要使用 ActionFilter:
定义新属性:
public class MySampleActionFilterAttribute : IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
}
public void OnActionExecuting(ActionExecutingContext context)
{
var user = context.HttpContext.User;
context.HttpContext.Response.StatusCode = 200;
context.Result = new ObjectResult(new { ... });
}
}
注意:您必须在名称末尾使用单词 Attribute
并在startup.cs中注册:
services.AddControllers(options => options.Filters.Add<MySampleActionFilterAttribute>());
并在控制器中使用:
[MySampleActionFilter]
[HttpGet]
[Route("Example")]
public async Task<IActionResult> ExampleMethod()
{}
阅读本文档: https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-5.0