首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP.NET核心3.1,从当前HttpContext中的referrer获取控制器和操作名称

ASP.NET核心3.1,从当前HttpContext中的referrer获取控制器和操作名称
EN

Stack Overflow用户
提问于 2022-09-04 06:14:03
回答 2查看 203关注 0票数 2

我需要获得路由数据信息,特别是控制器和操作名称的当前reqests参考url。我正在使用端点路由功能。我在某个地方读到,如果启用了端点路由功能,IRouter是不适用的。

代码语言:javascript
运行
复制
//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

代码语言:javascript
运行
复制
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();
    });
}

任何指针或想法都将不胜感激。提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2022-09-05 05:23:53

我不知道您是在哪里编写这段代码的,但是下面是一个.NET 6应用程序,它演示了如何从自定义中间件访问端点和ControllerActionDescriptor

代码语言:javascript
运行
复制
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";
}
票数 1
EN

Stack Overflow用户

发布于 2022-09-05 07:31:35

您可以检查与路由相关的文档,在文档中已经提到:

当路由中间件执行时,它从当前请求中将端点和路由值设置为HttpContext上的请求特性:

调用HttpContext.GetEndpoint将获得端点。

HttpRequest.RouteValues获取路由值的集合。

你可以试试

代码语言:javascript
运行
复制
HttpContext.Request.RouteValues["controller"].ToString();

代码语言:javascript
运行
复制
HttpContext.Request.RouteValues["action"].ToString();

如果您对此案有进一步的疑问,请向我们提供更多的细节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73597158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档