Как я могу получить Http Verb атрибут действия, используя отражение - ASP.NET Core? - PullRequest
2 голосов
/ 25 сентября 2019

Я пытаюсь найти глагол Http (Get, Post, Push, Delete и т. Д.) Каждого действия метода API контроллера.Предыстория: попытка создать документацию кода состояния ProducesResponseType для Swagger, просмотрев действие http (у компании есть бизнес-правила, связывающие действие с требуемым StatusCode ProducesResponseType).

Так как найти глагол действия HTTP контроллера?

Кажется, это близко к отладке, однако, это кажется неправильным.

foreach (ControllerModel controller in context.Result.Controllers)
        {
            foreach (ActionModel action in controller.Actions)
     controller.Actions.[0].ActionMethod.CustomAttributes[2]

Код ссылки:

Net Core API: сделать глобальный параметр ProducesResponseType или автоматизировать

ProduceResponseTypeModelProvider.cs

public class ProduceResponseTypeModelProvider : IApplicationModelProvider
{
    public int Order => 3;

    public void OnProvidersExecuted(ApplicationModelProviderContext context)
    {
    }

    public void OnProvidersExecuting(ApplicationModelProviderContext context)
    {
        foreach (ControllerModel controller in context.Result.Controllers)
        {
            foreach (ActionModel action in controller.Actions)
            {
                // I assume that all you actions type are Task<ActionResult<ReturnType>>

                Type returnType = action.ActionMethod.ReturnType.GenericTypeArguments[0].GetGenericArguments()[0];

                action.Filters.Add(new ProducesResponseTypeAttribute(StatusCodes.Status510NotExtended));
                action.Filters.Add(new ProducesResponseTypeAttribute(returnType, StatusCodes.Status200OK));
                action.Filters.Add(new ProducesResponseTypeAttribute(returnType, StatusCodes.Status500InternalServerError));
            }
        }
    }
}

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    ...   
    services.TryAddEnumerable(ServiceDescriptor.Transient<IApplicationModelProvider, ProduceResponseTypeModelProvider>());
    ...
}

Есть ли более простой метод для определения глагола действия метода контроллера?

Вопросы ниже относятся к предыдущему .Net.У нас есть .Net Core 2.2.

Как получить атрибут глагола http действия с использованием рефлексии - ASP.NET Web API

Определить, является ли действиеметод POST или GET

Это были обычные ответы .Net

Ответы до:

var methodInfo = MethodBase.GetCurrentMethod();
var attribute = methodInfo.GetCustomAttributes(typeof(ActionMethodSelectorAttribute), true).Cast<ActionMethodSelectorAttribute>().FirstOrDefault();

if (HttpContext.Request.HttpMethod == HttpMethod.Post.Method)
 {
 // The action is a post
 }

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Вы можете получить HTTP-глаголы, поддерживаемые действиями со следующим фрагментом.Это будет работать только при использовании атрибутов.

var verbs = action.Attributes.OfType<HttpMethodAttribute>().SelectMany(x => x.HttpMethods).Distinct();

Пример:

public void OnProvidersExecuting(ApplicationModelProviderContext context)
{
    foreach (ControllerModel controller in context.Result.Controllers)
    {
        foreach (ActionModel action in controller.Actions)
        {
            var verbs = action.Attributes.OfType<HttpMethodAttribute>().SelectMany(x => x.HttpMethods).Distinct();

            foreach (var verbItem in verbs)
            {
                Console.WriteLine(verbItem);
            }
        }
    }
}
1 голос
/ 26 сентября 2019

Я пытаюсь получить ту же информацию

Вы можете попытаться использовать Request.HttpContext.Request.Method

Он вернет глагол http в виде строки, и вы можете использовать его для создания экземпляра Системы.Net.Http.HttpMethod объект с ним

var httpVerb = new HttpMethod(context.HttpContext.Request.Method);
...