ใน asp.net เวอร์ชันก่อนหน้าเราสามารถใช้ไฟล์
@Request.Url.AbsoluteUri
แต่ดูเหมือนว่ามันจะเปลี่ยนไป เราจะทำเช่นนั้นใน asp.net core 1.0 ได้อย่างไร?
ใน asp.net เวอร์ชันก่อนหน้าเราสามารถใช้ไฟล์
@Request.Url.AbsoluteUri
แต่ดูเหมือนว่ามันจะเปลี่ยนไป เราจะทำเช่นนั้นใน asp.net core 1.0 ได้อย่างไร?
คำตอบ:
คุณต้องได้รับโฮสต์และเส้นทางแยกกัน
@Context.Request.Host@Context.Request.Path
@
ระหว่างสองสาย? คุณช่วยอธิบายได้ไหม
@HttpContext
แทน@Context
. สำหรับการดู@Context
ผลงานบางส่วน ฉันลืมการใช้งานหรือไม่?
Url.Action("Action", null, null, Request.Url.Scheme);
stackoverflow.com/questions/434604/…
คุณต้องมีแบบแผนโฮสต์เส้นทางและ 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}")
คุณสามารถใช้วิธีการขยายของRequest
:
Request.GetDisplayUrl()
@using Microsoft.AspNetCore.Http.Extensions
แล้ว@Context.Request.GetDisplayUrl()
Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.
จากสิ่งนี้ฉันคิดว่าโซลูชันของ @ tmg ดีที่สุด (อาจรวมอยู่ในวิธีการขยายของคุณเอง)
ใช้คุณสมบัติ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 เดียวกัน
คุณสามารถพิจารณาใช้วิธีการขยายนี้ (จาก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¶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
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
หากคุณต้องการรับหมายเลขพอร์ตจากคำขอด้วยคุณจะต้องเข้าถึงผ่าน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
)
คำตอบที่ได้รับการยอมรับช่วยฉันเช่นเดียวกับความคิดเห็นจาก @padigan แต่ถ้าคุณต้องการรวมพารามิเตอร์สตริงการสืบค้นเช่นเดียวกับฉันลองทำสิ่งนี้:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
และคุณจะต้องเพิ่ม @using Microsoft.AspNetCore.Http.Extensions
ในมุมมองเพื่อให้เมธอด GetEncodedPathAndQuery () พร้อมใช้งาน
มีวิธีง่ายๆในการรับ 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