使用 ASP.NET Core 获取绝对 URL

2023-11-21

在 MVC 5 中,我使用以下扩展方法来生成绝对 URL,而不是相对 URL:

public static class UrlHelperExtensions
{
    public static string AbsoluteAction(
        this UrlHelper url,
        string actionName, 
        string controllerName, 
        object routeValues = null)
    {
        string scheme = url.RequestContext.HttpContext.Request.Url.Scheme;
        return url.Action(actionName, controllerName, routeValues, scheme);
    }

    public static string AbsoluteContent(
        this UrlHelper url,
        string contentPath)
    {
        return new Uri(url.RequestContext.HttpContext.Request.Url, url.Content(contentPath)).ToString();
    }

    public static string AbsoluteRouteUrl(
        this UrlHelper url,
        string routeName,
        object routeValues = null)
    {
        string scheme = url.RequestContext.HttpContext.Request.Url.Scheme;
        return url.RouteUrl(routeName, routeValues, scheme);
    }
}

ASP.NET Core 中的等效项是什么?

  • UrlHelper.RequestContext不复存在。
  • 你无法抓住HttpContext因为不再有静态HttpContext.Current财产。

据我所知,您现在需要HttpContext or HttpRequest还要传入的对象。我对吗?有什么办法可以获取当前的请求吗?

我是否走在正确的轨道上,域现在应该是一个环境变量,它可以简单地附加到相对 URL 上?这是更好的方法吗?


RC2 和 1.0 之后你不再需要注入IHttpContextAccessor给你的扩展类。它可以立即在IUrlHelper通过urlhelper.ActionContext.HttpContext.Request。然后,您将按照相同的想法创建一个扩展类,但更简单,因为不涉及注入。

public static string AbsoluteAction(
    this IUrlHelper url,
    string actionName, 
    string controllerName, 
    object routeValues = null)
{
    string scheme = url.ActionContext.HttpContext.Request.Scheme;
    return url.Action(actionName, controllerName, routeValues, scheme);
}

留下有关如何构建它并注入访问器的详细信息,以防它们对某人有用。您可能还只对当前请求的绝对 URL 感兴趣,在这种情况下请查看答案的末尾。


您可以修改您的扩展类以使用IHttpContextAccessor接口来获取HttpContext。一旦你有了上下文,你就可以得到HttpRequest实例来自HttpContext.Request并使用它的属性Scheme, Host, Protocol等如:

string scheme = HttpContextAccessor.HttpContext.Request.Scheme;

例如,您可能要求您的类配置 HttpContextAccessor:

public static class UrlHelperExtensions
{        
    private static IHttpContextAccessor HttpContextAccessor;
    public static void Configure(IHttpContextAccessor httpContextAccessor)
    {           
        HttpContextAccessor = httpContextAccessor;  
    }

    public static string AbsoluteAction(
        this IUrlHelper url,
        string actionName, 
        string controllerName, 
        object routeValues = null)
    {
        string scheme = HttpContextAccessor.HttpContext.Request.Scheme;
        return url.Action(actionName, controllerName, routeValues, scheme);
    }

    ....
}

这是你可以做的事情Startup类(Startup.cs 文件):

public void Configure(IApplicationBuilder app)
{
    ...

    var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
    UrlHelperExtensions.Configure(httpContextAccessor);

    ...
}

你可能会想出不同的方法来获得IHttpContextAccessor在你的扩展类中,但是如果你想最终将你的方法保留为扩展方法,你将需要注入IHttpContextAccessor进入你的静态类。 (否则你将需要IHttpContext作为每次调用的参数)


只获取当前请求的absoluteUri

如果只想获取当前请求的绝对uri,可以使用扩展方法GetDisplayUrl or GetEncodedUrl来自UriHelper班级。 (这与乌尔LHelper)

获取显示网址。以完全未转义的形式返回请求 URL 的组合组件(QueryString 除外),仅适用于 用于显示。此格式不应在 HTTP 标头或其他标头中使用 HTTP 操作。

获取编码Url。以完全转义的形式返回请求 URL 的组合组件,适合在 HTTP 标头和其他内容中使用 HTTP 操作。

为了使用它们:

  • 包含命名空间Microsoft.AspNet.Http.Extensions.
  • Get the HttpContext实例。它已经在某些类(如剃刀视图)中可用,但在其他类中,您可能需要注入IHttpContextAccessor如上所述。
  • 然后就可以使用它们了this.Context.Request.GetDisplayUrl()

这些方法的替代方法是使用中的值手动创建绝对 uriHttpContext.Request对象(类似于需要Https属性 does):

var absoluteUri = string.Concat(
                        request.Scheme,
                        "://",
                        request.Host.ToUriComponent(),
                        request.PathBase.ToUriComponent(),
                        request.Path.ToUriComponent(),
                        request.QueryString.ToUriComponent());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ASP.NET Core 获取绝对 URL 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 如何使用 c-ares 将 IP 解析为主机?

    这就是我到目前为止所做的 它可以编译 但当我尝试运行它时会出现段错误 include
  • 如何处理您想要扩展的密封在 .NET 库中的类?

    我正在阅读有关如何处理想要扩展 NET Framework 库中的密封类的问题的文章 这通常是一项常见且有用的任务 因此我开始思考 在这种情况下 有哪些解决方案 我相信在我读过的文章中演示了一种扩展密封类的 方法 但我现在不记得了 它不是扩
  • 如何获取通用 Windows 批处理文件时间戳

    我在 Windows 批处理文件中生成时间戳时遇到问题 因为我在不同的 Windows 版本上得到不同的日期格式 我的机器 gt echo date gt Tue 11 17 2009 友机 gt echo date gt 11 17 20
  • 如何使用 .bat 文件从 PATH 环境变量中删除特定标记?

    我正在编写卸载脚本 因此我想 撤消 安装对系统所做的修改 为了实现这个目标 我想解析PATH变量 并删除安装添加到的任何值PATH 为此 我开发了以下伪代码 保存内容PATH到临时变量 拆分PATH转换为令牌 使用 字符作为分隔符 并循环遍
  • 将表转换为分层字典?

    我有一个表格 A1 B1 C1 value A1 B1 C1 value A1 B1 C2 value A1 B2 C1 value A1 B2 C1 value A1 B2 C2 value A1 B2 C2 value A2 B1 C1
  • 瘦服务器:将 Rails 应用程序日志输出到控制台,如“rails s”那样

    我需要跑thin start or thin ssl start在我的 Rails 应用程序的根目录中 并查看输出到控制台的应用程序日志 类似于rails s does In config ru文件 位于应用程序的根目录 在该行之前添加以下
  • 授予 Node.js 访问证书/私钥的权限

    我正在尝试在我的 Node js 应用程序上使用 HTTPS 就像它已针对其他任何内容启用一样 我已经安装了密钥和证书 但我得到了Error EACCES permission denied当我试图在应用程序上指向它们时 密钥和证书都位于以
  • 是否可以保证 memset 将结构中的填充位清零?

    一般来说 根据 C 标准 是否可以保证带有 0 的 memset 会将 C 结构中的填充位清零 海湾合作委员会呢 例如 类似 struct MyStruct unsigned char member1 unsigned int member
  • 在 viewpager 中显示 Youtube 视频

    我想设置YouTube内的视频ViewPager 为此我设置了FrameLayout在适配器中 我在其中设置了 YoutubeVideoFragment 如下所示 我的 ViewPager 适配器 import android app Ac
  • 在 Go 中使用匿名成员扁平化编组 JSON 结构

    给出以下代码 转载于此处play golang org package main import encoding json fmt type User struct Id int json id Name string json name
  • 在 ggplot 中使用多个尺寸比例

    我正在尝试构建一个显示从一个类到另一个类的转换的图 我想要有代表根据类属性调整大小的每个类的圆圈 以及根据从一个类到另一个类的转换数量从一个类到另一个类的箭头 举个例子 library ggplot2 points lt data fram
  • php - 如何检索 div 标签属性值

    我有一个可以隐藏或不隐藏的 div 具体取决于用户 该 div 有一个名为 attrLoc 的属性 我想要的是能够从 php ini 检索该属性值 希望有人能帮忙 预先感谢您的回复 干杯 马克 My HTML div class hidde
  • 在行内行块下方添加一个 div

    我有一个内联块元素列表 它们换行形成几行 我想在行之间显示一个 div 元素 具体取决于特定元素所在的位置 例如 前几行已编号 如果我想定位第三个元素并显示全长元素 包含块的 div 的 100 那么它将如下所示 对于任何块 1 5 全长
  • 如何将地图转换为 url 查询字符串?

    您是否知道任何实用程序类 库可以将 Map 转换为 URL 友好的查询字符串 Example 我有一张地图 param1 12 param2 cat 我想得到 param1 12 param2 cat 最终输出 relativeUrl pa
  • java和javaw的区别

    我搜索以了解之间的区别java exe and javaw exe 我通读了Java exe 和 Javaw exe 之间的区别 那里指出java exe用于控制台和javaw exe用于窗口应用程序 在其他一些帖子中提到控制台不可用jav
  • 具有延迟加载功能的单元素枚举类型单例

    我读了很多关于在 java 中实现单调模式的不同风格的论坛和帖子 似乎 枚举是在 java 中实现单调模式的最佳方法 我想知道如何使用 Java Enum 在 java 中实现 SingleTone 模式带有延迟加载能力 因为枚举只是类 第
  • 使用 Maven 将 Dll 打包在 Jar 中 - 单一目标

    我在我的 Maven 项目中添加了一个 DLL 作为依赖项 如下所示
  • Google Drive Rest API:未经身份验证的使用已超出每日限制。继续使用需要注册

    我正在将我的应用程序从已弃用的 Google Drive Android API 迁移到 Drive Rest API 我使用新包实现了所需的行为 并且在模拟器中一切正常 应用程序要求访问用户的云端硬盘并让它上传文件 当我开始在真实设备上测
  • 使用 JNA 单击鼠标

    我正在尝试使用 JNA 模拟鼠标在窗口中的单击 public class App public static final int WM LBUTTONUP 514 public static final int WM LBUTTONDOWN
  • 使用 ASP.NET Core 获取绝对 URL

    在 MVC 5 中 我使用以下扩展方法来生成绝对 URL 而不是相对 URL public static class UrlHelperExtensions public static string AbsoluteAction this