如何在 ASP.NET Core Web API 中为端点定义自定义属性并在其中返回 ObjectResult?

问题描述 投票:0回答:2

我正在创建一个 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
}

我该怎么做?

感谢您的帮助。

asp.net-core attributes asp.net-core-webapi
2个回答
1
投票

不要使用属性,而是使用 ActionFilter 和 Attribute。

https://learn.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs

通过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>(); });

0
投票

您只需要使用 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

© www.soinside.com 2019 - 2024. All rights reserved.