繁体   English   中英

ASP.NET Core 3.1,从当前HttpContext中的referrer url获取controller和动作名称

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM