Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 如何在asp.net core 1.0中查看当前url_Asp.net Core_Asp.net Core Mvc_Asp.net Core 1.0 - Fatal编程技术网

Asp.net core 如何在asp.net core 1.0中查看当前url

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

在以前的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.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&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()

您需要使用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(Re‌​quest)如果您使用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
有效。我忘记使用了吗?在MVC
Url.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}";