netcore 8 api如何不带[HttpPost("GetJwtToken")]中的("GetJwtToken")而是直接根据方法名判断不同的请求地址
时间: 2024-09-24 13:24:21 浏览: 66
spring根据controller中接收请求参数不同走不同service的实现方法
5星 · 资源好评率100%
在.NET Core 8中,如果你想要根据HTTP方法和方法名称动态确定API的路由,你可以使用基于动作筛选器(ACTION Filters)或者自定义中间件(Middleware)。这里推荐使用控制器类中的ActionName属性和Attribute Routing来实现。
**1. ACTION Filters**
在Controller类上添加一个ActionFilter,比如:
```csharp
public class CustomRouteAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
var actionName = context.ActionDescriptor.ActionName;
var httpMethod = context.HttpContext.Request.Method;
switch (actionName)
{
case "GetJwtToken":
if (httpMethod == "GET")
{
// 对于GET请求,处理GetJwtToken逻辑
// ...
}
else
{
context.Result = BadRequest("Invalid HTTP method");
}
break;
// 添加对其他方法的支持
// ...
}
base.OnActionExecuting(context);
}
}
```
然后在需要应用此过滤器的控制器上添加`[CustomRoute]`:
```csharp
[CustomRoute]
public class YourController : ControllerBase
{
[HttpGet]
public ActionResult<string> GetJwtToken()
{
// JWT token获取逻辑
// ...
}
// 其他方法...
}
```
**2. 自定义中间件**
如果你更喜欢使用自定义中间件,可以在Startup.cs文件中创建并注册一个全局的MiddleWare:
```csharp
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.Use(async (context, next) =>
{
var actionName = context.ActionDescriptor.ActionName;
var httpMethod = context.Request.Method;
switch (actionName)
{
case "GetJwtToken":
if (httpMethod == "GET")
{
await next(); // 执行后续处理
}
else
{
context.Response.StatusCode = StatusCodes.Status405.MethodNotAllowed;
}
break;
// 添加对其他方法的支持
// ...
}
await next();
});
// 其他中间件配置...
}
```
这样,当发起"GetJwtToken"方法的请求时,如果HTTP方法是GET,就会按预期处理;如果不是GET,则返回405 Method Not Allowed。
阅读全文