วิธีรับ url ปัจจุบันในมุมมองใน asp.net core 1.0


104

ใน asp.net เวอร์ชันก่อนหน้าเราสามารถใช้ไฟล์

@Request.Url.AbsoluteUri

แต่ดูเหมือนว่ามันจะเปลี่ยนไป เราจะทำเช่นนั้นใน asp.net core 1.0 ได้อย่างไร?



6
@DavidG ดูเหมือนว่าตอนนี้คุณสามารถใช้ UriHelper.GetDisplayUrl (Re‌ quest)
Mark G

คำตอบ:


122

คุณต้องได้รับโฮสต์และเส้นทางแยกกัน

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

14
การดำเนินการนี้จะไม่รายงาน url ที่ถูกต้องหากแอปของคุณอยู่ในไดเรกทอรีเสมือน คุณจะต้องนำหน้าค่าRequest.Pathด้วยค่าRequest.PathBaseหากมี สิ่งนี้ใช้ได้กับคำตอบอื่น ๆ เกือบทั้งหมดของคำถามนี้เช่นกัน
padigan

นี่คืออะไร@ระหว่างสองสาย? คุณช่วยอธิบายได้ไหม
Mohammed Noureldin

3
@MohammedNoureldin: นั่นคือไวยากรณ์ของมุมมองมีดโกน
jack.pop

2
สำหรับหน้ามีดโกนฉันต้องใช้@HttpContextแทน@Context. สำหรับการดู@Contextผลงานบางส่วน ฉันลืมการใช้งานหรือไม่?
Andriod

2
มีวิธีง่ายๆใน MVC Url.Action("Action", null, null, Request.Url.Scheme); stackoverflow.com/questions/434604/…
แดน

110

คุณต้องมีแบบแผนโฮสต์เส้นทางและ 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}")

1
คุณจะได้รับส่วนอย่างไรโดยพูดว่าtest.com/abc#123คุณจะได้รับชิ้นส่วน # 123 จากคำขอได้อย่างไร
Ray

4
@fanray คุณทำไม่ได้ เบราว์เซอร์ไม่ได้ส่ง URI-fragments ไปยังเซิร์ฟเวอร์
tmg

พิจารณาใช้UriBuilderเพื่อสร้าง URL
Erik Philips

86

คุณสามารถใช้วิธีการขยายของRequest:

Request.GetDisplayUrl()

33
สิ่งนี้ใช้ได้ผลถ้าคุณเพิ่ม@using Microsoft.AspNetCore.Http.Extensionsแล้ว@Context.Request.GetDisplayUrl()
Serj Sagan

2
ยังคงได้รับ - คำขอไม่มีอยู่ในบริบทปัจจุบัน
SeanMC

1
โปรดทราบว่าสรุป Intellisense สำหรับฟังก์ชันนี้กล่าวว่าSuitable only for display. This format should not be used in HTTP headers or other HTTP operations.จากสิ่งนี้ฉันคิดว่าโซลูชันของ @ tmg ดีที่สุด (อาจรวมอยู่ในวิธีการขยายของคุณเอง)
Gordon Glas

16

เห็นได้ชัดว่าสิ่งนี้เป็นไปได้เสมอใน. net core 1.0 ด้วยMicrosoft.AspNetCore.Http.Extensionsซึ่งเพิ่มส่วนขยายเพื่อHttpRequestให้ได้ URL แบบเต็ม GetEncodedUrl

เช่นจากมุมมองมีดโกน:

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

ตั้งแต่ 2.0 ยังมีทางญาติและแบบสอบถามGetEncodedPathAndQuery


15

ใช้คุณสมบัติAbsoluteUriของ Uri กับ. Net core ที่คุณต้องสร้าง 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 เดียวกัน


8
สิ่งต่างๆเช่นนี้ทำให้ฉันคิดว่า. Net Core เป็นการถอยหลังในบางวิธี จะดีกว่า Request.Url ใน Asp.Net ในแบบที่ฉันนึกไม่ถึงหรือเปล่า?
Soenhay

8

คุณสามารถพิจารณาใช้วิธีการขยายนี้ (จาก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

7
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);
}

แต่คุณจะไปhttpContextที่ไหน? ที่จะไม่ทำงานกับ Microsoft.AspNetCore.Http.HttpContext.Request
Tom Stickel

7

หากคุณต้องการรับหมายเลขพอร์ตจากคำขอด้วยคุณจะต้องเข้าถึงผ่านRequest.Hostคุณสมบัติสำหรับ AspNet Core

Request.Hostคุณสมบัติไม่เพียงสตริง แต่แทนวัตถุที่ถือทั้งโดเมนโฮสต์ที่และหมายเลขพอร์ต หากหมายเลขพอร์ตเฉพาะเขียนออกมาใน URL (เช่น"https://example.com:8080/path/to/resource") แล้วโทรจะทำให้คุณโดเมนโฮสต์และหมายเลขพอร์ตเช่นดังนั้น:Request.Host"example.com:8080"

หากคุณต้องการเพียงค่าสำหรับโดเมนโฮสต์หรือต้องการเพียงค่าสำหรับหมายเลขพอร์ตคุณสามารถเข้าถึงคุณสมบัติเหล่านั้นทีละรายการ (เช่นRequest.Host.HostหรือRequest.Host.Port)


6

คำตอบที่ได้รับการยอมรับช่วยฉันเช่นเดียวกับความคิดเห็นจาก @padigan แต่ถ้าคุณต้องการรวมพารามิเตอร์สตริงการสืบค้นเช่นเดียวกับฉันลองทำสิ่งนี้:

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

และคุณจะต้องเพิ่ม @using Microsoft.AspNetCore.Http.Extensionsในมุมมองเพื่อให้เมธอด GetEncodedPathAndQuery () พร้อมใช้งาน


2

มีวิธีง่ายๆในการรับ URL ปัจจุบันจากเพจ Razor หรือคลาส PageModel นั่นคือ:

Url.PageLink()

โปรดทราบว่าฉันหมายถึง "ASP.NET Core Razor Pages " ไม่ใช่ MVC

ฉันใช้วิธีนี้เมื่อต้องการพิมพ์เมตาแท็ก Canonical URL ในหน้ามีดโกน ASP.NET Core แต่มีการจับ. จะให้ URL ที่ควรจะเป็น URL ที่ถูกต้องสำหรับหน้านั้น ให้ฉันอธิบาย

สมมติว่าคุณได้กำหนดเส้นทางชื่อ "id" สำหรับเพจของคุณดังนั้น URL ของคุณควรมีลักษณะดังนี้

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

Url.PageLink () จะให้ URL ดังกล่าวตามที่แสดงด้านบน

ตอนนี้ถ้าผู้ใช้เพิ่มอะไรพิเศษใน URL นั้นให้พูดว่า

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

จากนั้นคุณจะไม่ได้รับ "somethingElse" จากวิธีนี้ และนั่นคือเหตุผลว่าทำไมจึงเหมาะอย่างยิ่งสำหรับการพิมพ์เมตาแท็ก URL ตามรูปแบบบัญญัติในหน้า HTML

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.