Asp.net core 如何在asp.net core 1.0中查看当前url
在以前的asp.net版本中,我们可以使用Asp.net core 如何在asp.net core 1.0中查看当前url,asp.net-core,asp.net-core-mvc,asp.net-core-1.0,Asp.net Core,Asp.net Core Mvc,Asp.net Core 1.0,在以前的asp.net版本中,我们可以使用 @Request.Url.AbsoluteUri 但它似乎改变了。在asp.net core 1.0中如何实现这一点?您必须分别获取主机和路径 @Context.Request.Host @Context.Request.Path 您需要scheme、host、path和queryString @string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Ho
@Request.Url.AbsoluteUri
但它似乎改变了。在asp.net core 1.0中如何实现这一点?您必须分别获取主机和路径
@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功能“字符串插值”
使用Uri的绝对Uri属性,在.Net内核中,您必须根据如下请求构建Uri
var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");
var url = location.AbsoluteUri;
e、 g.如果请求url为“”,则返回相同的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.GetDisplayUrl()
如果您还希望从请求中获取端口号,则需要通过AspNet Core的
request.Host
属性访问该端口号
Request.Host
属性不仅仅是一个字符串,而是一个同时包含主机域和端口号的对象。如果端口号明确地写在URL中(即)https://example.com:8080/path/to/resource“
),然后调用Request.Host
将为您提供主机域和端口号,如下所示:“example.com:8080”
如果您只需要主机域的值或只需要端口号的值,那么您可以单独访问这些属性(即
Request.host.host
或Request.host.port
)。这显然在.net core 1.0和Microsoft.AspNetCore.Http.Extensions
中始终是可能的,它将扩展名添加到HttpRequest
以获取完整的URL
e、 g.从剃须刀的角度来看:
@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>
@使用Microsoft.AspNetCore.Http.Extensions
...
2,也有相对路径和查询。可以考虑使用这个扩展方法(从<代码>微软.ASPNETCyr.http.ExpExp:/Cord>命名空间:
@Context.Request.GetDisplayUrl()
对于我的一些项目,我更喜欢更灵活的解决方案
1) 第一个方法从传入的请求数据创建Uri
对象(通过可选参数使用一些变量)。
2) 第二个方法接收Uri
对象并返回以下格式的string
(不带尾随斜杠):Scheme\u Host\u 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¶m2=b
Request.GetUri(addQuery: false);
//after >> https://localhost:44304/information/about
//before >> https://localhost:44304/information/about?param1=a¶m2=b
new Uri("https://localhost:44304/information/about?param1=a¶m2=b").GetHostWithNoSlash();
//after >> https://localhost:44304
接受的答案对我很有帮助,正如@padigan对它的评论一样,但如果您想像我一样包含查询字符串参数,请尝试以下方法:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
您需要使用Microsoft.AspNetCore.Http.Extensions在视图中添加
,以便GetEncodedPathAndQuery()方法可用。有一种从Razor页面或PageModel类获取当前URL的干净方法。即:
Url.PageLink()
请注意,我的意思是“ASP.NET核心Razor页面”,而不是MVC
当我想在ASP.NET核心页面中打印规范URL元标记时,我使用此方法。但有一个陷阱。它将为您提供该页面的正确URL。让我解释一下
比方说,您已经为页面定义了一个名为“id”的路由,因此,您的URL应该如下所示
http://example.com/product?id=34
PageLink()将为您提供如上所示的Url
现在,如果用户在该URL上添加了任何额外内容
http://example.com/product?id=34&somethingElse
然后,您将无法从该方法中获得“somethingElse”。这就是为什么它非常适合在HTML页面中打印规范的URL元标记。像这样@DavidG看起来您现在可以使用UriHelper.GetDisplayUrl(Request)如果您使用Microsoft.AspNetCore.Http.Extensions添加,然后@Context.Request.GetDisplayUrl()
仍在获取-请求在当前上下文中不存在请记住此函数的intellisense摘要说明仅适用于显示。此格式不应用于HTTP头或其他HTTP操作。
基于此,我认为@tmg的解决方案是最好的(可能包装在您自己的扩展方法中)。如果您希望它与以前的Url对象类型相同,您可以在获得显示Url后执行此操作:var uri=new uri(displayUrl);你如何获得片段,比如说,你如何从请求中获得#123片段?@fanray你不能。浏览器未将URI片段发送到服务器。请考虑使用该片段构建url。如果应用程序位于虚拟目录中,则不会报告正确的url。如果存在Request.PathBase值,则需要在Request.Path值前面加上Request.PathBase值。这几乎适用于这个问题的所有其他答案。@MohammedNoureldin:这是razor视图语法。对于razor页面,我必须使用@HttpContext
而不是@Context
。对于局部视图@Context
有效。我忘记使用了吗?在MVCUrl.Action(“Action”,null,null,Request.Url.Scheme)中有一个简单的方法
您需要将Request.QueryString
添加到请求的末尾。Path不包含查询字符串。类似这样的事情让我觉得.Net Core在某些方面是一种倒退。在某种程度上,这比Asp.Net中的Request.Url好吗?我无法想象。但是你从哪里得到了httpContext
?这对Microsoft.AspNetCore.Http.HttpContext.Request不起作用
感谢您包含@using语句
var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}{Context.Request.QueryString}";
var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}{Context.Request.QueryString}";