2015-01-23 13 views
21

Lớp HttpRequest trong Asp.Net 5 (vNext) chứa (trong số những thứ khác) phân tích chi tiết về các URL cho yêu cầu, chẳng hạn như Scheme, Host, Path, vvNhận URL liệu từ Microsoft.AspNet.Http.HttpRequest

Tôi chưa phát hiện thấy ở bất kỳ đâu nhưng vẫn hiển thị URL yêu cầu ban đầu - chỉ những giá trị được phân tích cú pháp này. (Trong các phiên bản trước đó có Request.Uri)

Tôi có thể lấy lại URL thô mà không phải ghép chúng lại với nhau từ các thành phần có sẵn trên HttpRequest không?

+1

Lỗi có vẻ đã được gửi trước đó về điều này nhưng đã đóng ... bạn có thể kiểm tra chi tiết và nếu bạn cảm thấy mạnh hơn, có thể cập nhật chi tiết: https: // github. com/aspnet/HttpAbstractions/issues/110 –

+0

@KiranChalla: Tôi sắp xếp quan điểm của mình, mặc dù nó khiến tôi tự hỏi RawURL là gì trong các phiên bản trước đó. Tôi đoán những gì họ hiện đang hiển thị về các chương trình, máy chủ vv có thể được divined từ phía máy chủ xử lý yêu cầu, và không phải bất cứ điều gì về yêu cầu riêng của mình. –

+0

bạn đã thử ToString() chưa? –

Trả lời

27

Dường như bạn không thể truy cập trực tiếp, nhưng bạn có thể xây dựng nó sử dụng framework:

Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request) 

Bạn cũng có thể sử dụng trên như một phương pháp mở rộng.

Điều này trả về một string thay vì Uri, nhưng nó sẽ phục vụ mục đích! (Điều này cũng dường như đóng vai trò của UriBuilder.)

Nhờ @mswietlicki đã chỉ ra rằng nó vừa được tái cấu trúc hơn là mất tích! Và cũng để @ C-F để chỉ ra sự thay đổi không gian tên trong câu trả lời của tôi!

+4

Điều này không còn hoạt động như beta-5 nữa. Tôi không có giải pháp thay thế tốt hoặc sẽ cập nhật câu trả lời của mình. –

+4

Tôi tin rằng điều này đã được thực hiện một phương pháp mở rộng thực sự - bạn chỉ cần nhập không gian tên và gọi 'GetEncodedUri' hoặc' GetDisplayUri', tùy thuộc vào trường hợp sử dụng của bạn. – dlras2

+13

sử dụng Microsoft.AspNet.Http.Extensions; và đó Request.GetDisplayUrl() – mswietlicki

2

Phương pháp mở rộng sau tái tạo logic từ trước beta5 UriHelper:

public static string RawUrl(this HttpRequest request) { 
    if (string.IsNullOrEmpty(request.Scheme)) { 
     throw new InvalidOperationException("Missing Scheme"); 
    } 
    if (!request.Host.HasValue) { 
     throw new InvalidOperationException("Missing Host"); 
    } 
    string path = (request.PathBase.HasValue || request.Path.HasValue) ? (request.PathBase + request.Path).ToString() : "/"; 
    return request.Scheme + "://" + request.Host + path + request.Query; 
} 
0

Trong ASP.NET 5 beta5:

Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
    request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString); 
12

Thêm gói NuGet/sử dụng:

using Microsoft.AspNetCore.Http.Extensions; 

(Trong ASP.NET Core RC1 đây là trong Microsoft.AspNet.Http.Extensions)

sau đó bạn có thể nhận được địa chỉ yêu cầu http đầy đủ bằng cách thực hiện:

var url = httpContext.Request.GetEncodedUrl(); 

hoặc

var url = httpContext.Request.GetDisplayUrl(); 

tùy thuộc vào mục đích.

+0

ASP.NET Core RC2 có sẵn ngay bây giờ không? – Sergey

+0

Có - https://blogs.msdn.microsoft.com/webdev/2016/05/16/announcing-asp-net-core-rc2/ –

+0

Nhìn vào nguồn, rõ ràng làm một số mã hóa/giải mã để điều này sẽ không được url thô. Ngoài ra, IIS sẽ thay đổi đôi khi thay đổi url trước khi nó được gửi đến Kestrel ví dụ: % 2F -> /. –

2

Nếu bạn thực sự muốn thực tế URL liệu,, bạn có thể sử dụng phương pháp mở rộng sau:

public static class HttpRequestExtensions 
{ 
    public static Uri GetRawUrl(this HttpRequest request) 
    { 
     var httpContext = request.HttpContext; 

     var requestFeature = httpContext.Features.Get<IHttpRequestFeature>(); 

     return new Uri(requestFeature.RawTarget); 
    } 
} 

Phương pháp này sử dụng các RawTarget được yêu cầu, mà không nổi lên trên HttpRequest đối tượng. Tài sản này đã được thêm vào trong phiên bản 1.0.0 của ASP.NET Core. Đảm bảo bạn đang chạy phiên bản mới hơn hoặc phiên bản mới hơn.

LƯU Ý! Khách sạn này cho thấy nhiều URL liệu, vì vậy nó chưa được giải mã, như ghi nhận của tài liệu:

Khách sạn này không được sử dụng trong nội bộ về các quyết định định tuyến hoặc uỷ quyền. Nó đã không được UrlDecoded và chăm sóc nên được thực hiện trong việc sử dụng nó.

+0

Tôi đang sử dụng ASP .NET Core với đầy đủ .NET Framework. Điều này dường như không làm việc cho tôi ('RawTarget' không được định nghĩa trên' IHttpRequestFeature'). Bạn có thể nghĩ ra một giải pháp thay thế không? –

+1

'RawTarget' đã được thêm vào bản phát hành 1.0, [trở lại có thể] (https://github.com/aspnet/HttpAbstractions/pull/639). Bạn có chắc là bạn đang chạy trên phiên bản mới nhất không? – khellang

+0

Nếu lưu trữ bằng IIS, IIS sẽ thay đổi đôi khi thay đổi url trước khi nó được gửi đến Kestrel. Một ví dụ về điều này là% 2F được giải mã thành /. –

2

Phần mở rộng này làm việc cho tôi:

sử dụng Microsoft.AspNetCore.Http;

public static class HttpRequestExtensions 
    { 
     public static string GetRawUrl(this HttpRequest request) 
     { 
      var httpContext = request.HttpContext; 
      return $"{httpContext.Request.Scheme}://{httpContext.Request.Host}{httpContext.Request.Path}{httpContext.Request.QueryString}"; 
     } 
    } 
Các vấn đề liên quan