如何在 asp.net 核心1.0中查看当前网址

在 asp.net 的早期版本中,我们可以使用

@Request.Url.AbsoluteUri

但是它似乎已经改变了,我们如何在 asp.net 核心1.0中做到这一点呢?

193540 次浏览

您必须分别获取主机和路径。

 @Context.Request.Host
@Context.Request.Path

您需要 scheme、 host、 path 和 queryString

@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)

或者使用新的 C # 6特性“字符串插值”

@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")

使用 Uri 的 绝对的属性,使用.Net 核心,您必须根据这样的请求构建 Uri,

 var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");


var url = location.AbsoluteUri;

例如,如果请求的 url 是“ http://www.contoso.com/catalog/shownew.htm?date=today”,这将返回相同的 url。

public string BuildAbsolute(PathString path, QueryString query = default(QueryString), FragmentString fragment = default(FragmentString))
{
var rq = httpContext.Request;
return Microsoft.AspNetCore.Http.Extensions.UriHelper.BuildAbsolute(rq.Scheme, rq.Host, rq.PathBase, path, query, fragment);
}

你可以使用 Request的扩展方法:

Request.GetDisplayUrl()

如果您还希望从请求中获取 < em > 端口号 ,那么您需要通过 AspNet Core 的 Request.Host属性访问它。

Request.Host属性不仅仅是一个字符串,而是一个对象,它同时保存主机域 还有的端口号。如果 URL 中的端口号是特定的 写出来(即 "https://example.com:8080/path/to/resource") ,那么调用 Request.Host将提供主机域和端口号,如下所示: "example.com:8080"

如果您只想要主机域的值或者只想要端口号的值,那么您可以单独访问这些属性(即 Request.Host.HostRequest.Host.Port)。

这显然总是可能的。Net core 1.0和 Microsoft.AspNetCore.Http.Extensions,后者增加了对 HttpRequest的扩展以获得完整的 URL;。

例如:

@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>

自2.0以来,还有相对路径和查询 GetEncodedPathAndQuery

您可以考虑使用这种扩展方法(来自 Microsoft.AspNetCore.Http.Extensions名称空间:

@Context.Request.GetDisplayUrl()

对于我的一些项目,我更喜欢更灵活的解决方案。

1)第一种方法根据传入的请求数据创建 Uri对象(通过可选参数创建一些变体)。 2)第二个方法接收 Uri对象并以以下格式(没有尾斜杠)返回 string: Scheme _ Host _ Port

public static Uri GetUri(this HttpRequest request, bool addPath = true, bool addQuery = true)
{
var uriBuilder = new UriBuilder
{
Scheme = request.Scheme,
Host = request.Host.Host,
Port = request.Host.Port.GetValueOrDefault(80),
Path = addPath ? request.Path.ToString() : default(string),
Query = addQuery ? request.QueryString.ToString() : default(string)
};
return uriBuilder.Uri;
}


public static string HostWithNoSlash(this Uri uri)
{
return uri.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped);
}

用法:

//before >> https://localhost:44304/information/about?param1=a&param2=b
Request.GetUri(addQuery: false);
//after >> https://localhost:44304/information/about


//before >> https://localhost:44304/information/about?param1=a&param2=b
new Uri("https://localhost:44304/information/about?param1=a&param2=b").GetHostWithNoSlash();
//after >> https://localhost:44304

接受的答案帮助了我,@padigan 的评论也帮助了我,但是如果你想像我一样包含查询字符串参数,那么试试这个:

@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()

为了使 GetEncodedPathAndQuery ()方法可用,您需要在视图中添加 @using Microsoft.AspNetCore.Http.Extensions

有一种干净的方法可以从 Razor 页面或 PageModel 类获取当前 URL,即:

Url.PageLink()

请注意,我的意思是“ ASP.NET 核心 剃刀页”,而不是 MVC。

当我想要在 ASP.NET 核心页面中打印规范的 URL 元标记时,我使用这种方法。但有一个问题。它会给你的网址,这应该是正确的网址为该网页。听我解释。

例如,您已经为您的页面定义了一个名为“ id”的路由,因此,您的 URL 应该如下所示

http://example.com/product?id=34

如上所示,URL.PageLink ()将提供确切的 URL。

现在,如果用户在这个 URL 上添加了任何额外的东西,比如,

http://example.com/product?id=34&somethingElse

然后,您将不会从这个方法得到“ something else”。这就是为什么它非常适合在 HTML 页面中打印规范的 URL 元标记。

var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}{Context.Request.QueryString}";

ILSpy 展示了它是如何在微软中完成的。

// Microsoft.Owin.OwinRequest
using System;


/// <summary>
/// Gets the uniform resource identifier (URI) associated with the request.
/// </summary>
/// <returns>The uniform resource identifier (URI) associated with the request.</returns>
public virtual Uri Uri => new Uri(string.Concat(Scheme, Uri.SchemeDelimiter, Host, PathBase, Path, QueryString));

我想知道他们为什么要搬走这里。

你可能想要得到这个网址来使用它,有另一种方法可以得到这个家庭应用的网址:

Url.Content("~/.....")

例子

在下面的例子中,我想生成一个二维码并在一个 img标签 src 中显示它,因为在 Action中使用了自定义路由注释,我不能使用 @URL.Action,所以作为一个替代解决方案,我使用 ~如下:

<script>
$("#imgCode").attr("src", "@(Url.Content("~/generateQr/"))"+ code);


</script>

控制端

[Route("/generateQr/{code}")]
...