gpt4 book ai didi

c# - 如何使用反射获取 Action 的 Http Verb 属性 - ASP.NET Core?

转载 作者:行者123 更新时间:2023-12-03 08:52:10 30 4
gpt4 key购买 nike

我正在尝试查找每个控制​​器 API 方法操作的 Http 动词(Get、Post、Push、Delete 等)。背景:尝试通过查看 http 操作来为 Swagger 创建 ProducesResponseType 状态代码文档(公司具有将操作链接到所需 ProducesResponseType StatusCode 的业务规则)。

那么如何定位Controller的HTTP Action 动词呢?

这在调试中似乎很接近,但是,这似乎并不正确。

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

引用代码:

Net Core API: Make ProducesResponseType Global Parameter or Automate

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

是否有更简单的方法来检测 Controller 方法的 Action 动词?

以下问题适用于以前的 .Net。我们有 .Net Core 2.2。

How do I get http verb attribute of an action using refection - ASP.NET Web API

Detect if action is a POST or GET method

这些是常规 .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
}

最佳答案

我正在尝试获取相同的信息

你可以尝试使用Request.HttpContext.Request.Method

它将以字符串形式返回 http 动词,您可以使用它来实例化 System.Net.Http.HttpMethod 对象

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

关于c# - 如何使用反射获取 Action 的 Http Verb 属性 - ASP.NET Core?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58090707/

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