[英]ASP.NET Core 3.1, get the controller and action name from referrer url in the current HttpContext
我需要获取 routedata 信息,特别是 controller 和当前请求引荐来源 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
}
启动.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();
});
}
任何指针或想法将不胜感激。 提前致谢。
我不确定您在哪里编写此代码,但这里有一个 .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";
}
您可以查看与路由相关的文档,在文档中已经提到:
当一个路由中间件执行时,它会从当前请求中设置一个 Endpoint 和路由值到 HttpContext 上的一个请求特性:
调用 HttpContext.GetEndpoint 获取端点。
HttpRequest.RouteValues 获取路由值的集合。
你可以试试
HttpContext.Request.RouteValues["controller"].ToString();
和
HttpContext.Request.RouteValues["action"].ToString();
如果您对此案有其他问题,请向我们展示更多详细信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.