我正在我的项目中编写一个中间件类,以便将请求数据记录到我们的数据库中。
我没有看到任何简单的方法来获取控制器名称和操作? 有没有机会在核心轻松做到这一点?
我有这样的事情:
public class RequestResponseLoggingMiddleware
{
private readonly RequestDelegate _next;
public RequestResponseLoggingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
//handle the request
//something like: context.GetRouteData();
await _next(context);
//handle the response
}
}
答案 0 :(得分:13)
我遇到了同样的问题,这在.NetCore 3.1中对我有用:
public async Task InvokeAsync(HttpContext httpContext)
{
var controllerActionDescriptor = httpContext
.GetEndpoint()
.Metadata
.GetMetadata<ControllerActionDescriptor>();
var controllerName = controllerActionDescriptor.ControllerName;
var actionName = controllerActionDescriptor.ActionName;
await _next(httpContext);
}
为了使GetEndpoint()
返回null的实际端点instad,必须满足以下条件。
AddControllers()
代替AddMvc()
)UseRouting()
和UseEndpoints()
之间调用中间件。答案 1 :(得分:6)
在.NET Core 2.0中,您可以在Filter:
中执行此操作public class AuthorizationFilter : IAsyncAuthorizationFilter
{
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;
string controllerName = controllerActionDescriptor?.ControllerName;
string actionName = controllerActionDescriptor?.ActionName;
}
}
答案 2 :(得分:2)
要添加Ganesh的答案,我想添加一些条件。
AddControllers()
代替AddMvc()
)UseRouting()
和UseEndpoints()
之间调用中间件。否则GetEndpoint()
返回null。
答案 3 :(得分:1)
控制器和操作数据可通过过滤器获得,因此我以这种方式实现了它。控制器和操作数据在ActionExecutingContext对象中可用。
public class AsyncActionFilter : IAsyncActionFilter
{
public AsyncActionFilter(IEntityContext entityContext)
{
_entityContext = entityContext;
}
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
//Handle the request
await next();
}
}