1

I am creating an ASP.NET Core Web API project. I want to define an attribute (for example ExampleAttribute) and access the HttpContext in it and doing some action and finally return an ObjectResult if necessary, or continue.

I don't know if I am doing it right or not, but I want to define an attribute in this way:

    public class DeveloperTaskAttribute : Attribute
    {
        // using HttpContext and doing some action

        // I will returning BadRequest("") if necessary
        // or continue...
    }

And I'm trying to use this attribute on this endpoint:

    [HttpGet]
    [ExampleAttribute] // using attribute
    public IActionResult EndPoint1() 
    {      
        // doing some action in endpoint1
    }

How can I do this?

Thanks for any help.

2 Answers 2

3

Instead of using attribute, use ActionFilter and Attribute.

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

Get custom attributes via ActionExecutingContext from controller .Net Core

First define an attribute :

[AttributeUsage(AttributeTargets.Method)]
public sealed class SampleAttribute : Attribute
{ 
}

Then define a class which is implement 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 });
    }
}

To register this action filter :

services.AddControllers(mvcOptions => { mvcOptions.Filters.Add<SampleActionFilter>(); });
Sign up to request clarification or add additional context in comments.

Comments

1

You need to use ActionFilterAttribute Only:

Defining a new Attribute:


    public class TestAttribute : TypeFilterAttribute
        {
            public TestAttribute() : base(typeof(TestFilter))
            {
            }
    
            private class TestFilter : ActionFilterAttribute
            {
                private readonly MyDbContext _myDbContext;
    
                public TestFilter(MyDbContext myDbContext)
                {
                    _myDbContext = myDbContext;
                }
    
                public override void OnActionExecuting(ActionExecutingContext context)
                {
                    // Dont use async - await methods !
                    // Do something
                    var user= context.HttpContext.User    
                }
            }
    
    
        }

Note: You must use the word Attribute at the end of the name

And using in controller:

        [Test]
        [HttpGet]
        [Route("Example")]
        public async Task<IActionResult> ExampleMethod()
        {}

Documentation: https://www.andybutland.dev/2020/06/dependency-injection-in-aspnet-core-attributes.html

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.