我需要获得路由数据信息,特别是控制器和操作名称的当前reqests参考url。我正在使用端点路由功能。我在某个地方读到,如果启用了端点路由功能,IRouter是不适用的。
//var router = context.HttpContext.RequestServices.GetService<IRouter>();
//router is null, since i used UseEndpoints routing i guess
Uri urlReferrer = context.HttpContext.Request.GetTypedHeaders().Referer;
if (urlReferrer != null)
{
var requestFeature = new HttpRequestFeature()
{
Method = "GET",
PathBase = string.Empty,
Path = urlReferrer.AbsoluteUri,
QueryString = urlReferrer.Query
};
var features = new FeatureCollection();
features.Set<IHttpRequestFeature>(requestFeature);
var httpContext = new DefaultHttpContext(features);
var ep = httpContext.GetEndpoint();
//ep is null since the context is not passed through routing, i guess
//how do i pass this httpcontext though routing middleware to get the route values
//tried RouteAsync but IRouter is null
//var routeContext = new RouteContext(httpContext);
//context.RouteData.Routers.Add(router);
//await router.RouteAsync(routeContext);
var reffererActionName = httpContext.GetRouteData().Values["action"].ToString();
var reffererControllerName = httpContext.GetRouteData().Values["controller"].ToString();
//i need the action+controller name for the referrer url
}
Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider sp)
{
...
app.UseRouting();
...
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Landing}/{action=Index}/{id?}");
//endpoints.MapRazorPages();
});
}
任何指针或想法都将不胜感激。提前谢谢。
发布于 2022-09-05 05:23:53
我不知道您是在哪里编写这段代码的,但是下面是一个.NET 6应用程序,它演示了如何从自定义中间件访问端点和ControllerActionDescriptor
:
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Controllers;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.Use((context, next) =>
{
var controllerActionDescriptor = context.GetEndpoint()?.Metadata.GetMetadata<ControllerActionDescriptor>();
if (controllerActionDescriptor != null)
{
// Get the controller information here
}
return next(context);
});
app.MapControllers();
app.Run();
public class MyController : ControllerBase
{
[HttpGet("/")]
public string Get() => "Hello World";
}
发布于 2022-09-05 07:31:35
您可以检查与路由相关的文档,在文档中已经提到:
当路由中间件执行时,它从当前请求中将端点和路由值设置为HttpContext上的请求特性:
调用HttpContext.GetEndpoint将获得端点。
HttpRequest.RouteValues获取路由值的集合。
你可以试试
HttpContext.Request.RouteValues["controller"].ToString();
和
HttpContext.Request.RouteValues["action"].ToString();
如果您对此案有进一步的疑问,请向我们提供更多的细节。
https://stackoverflow.com/questions/73597158
复制相似问题