Nhận URL thô từ Microsoft.AspNet.Http.HttpRequest


88

Các HttpRequestlớp trong Asp.Net 5 (vNext) chứa (trong số những thứ khác) Các chi tiết phân tích về các URL cho yêu cầu, chẳng hạn như Scheme, Host, Path, vv

Mặc dù vậy, tôi vẫn chưa phát hiện ra bất kỳ nơi nào làm lộ 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 cần phải ghép nó lại với nhau từ các thành phần có sẵn trên HttpRequest không?


1
Một lỗi dường như đã được gửi trước đó về vấn đề này nhưng đã đóng ... bạn có thể kiểm tra chi tiết về nó và nếu bạn cảm thấy mạnh hơn về nó, có thể cập nhật nó với chi tiết: github.com/aspnet/HttpAbstraction/issues/110
Kiran Challa

@KiranChalla: Tôi hiểu quan điểm của họ, 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ề lược đồ, máy chủ lưu trữ, v.v. có thể được phân chia từ xử lý phía máy chủ của yêu cầu, chứ không phải bất kỳ thứ gì trong bản thân yêu cầu.
Jon Egerton

bạn đã thử ToString () chưa?
agua from mars

Câu trả lời:


82

Có vẻ như bạn không thể truy cập trực tiếp vào nó, nhưng bạn có thể xây dựng nó bằng cách sử dụng khung:

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

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

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

Cảm ơn @mswietlicki đã chỉ ra rằng nó chỉ được cấu trúc lại chứ không phải bị thiếu! Và cũng đến @CF để 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 kể từ phiên bản beta-5. 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.
Matt DeKrey

13
Tôi tin rằng đây là 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 một trong hai GetEncodedUrihoặc GetDisplayUri, tùy thuộc vào trường hợp sử dụng của bạn.
dlras 2

42
sử dụng Microsoft.AspNet.Http.Extensions; và
Yêu cầu đó.GetDisplayUrl

8
Không gian tên phù hợp hiện là Microsoft.AspNetCore.Http.Extensions
CF

9
Đối với ASP.NET Core 1.0, hãy thêm bằng cách sử dụng "Microsoft.AspNetCore.Http.Extensions" vào dạng xem Razor của bạn. Để lấy url, hãy sử dụng "@ Context.Request.GetDisplayUrl ()".
Joop,

75

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

using Microsoft.AspNetCore.Http.Extensions; 

(Trong ASP.NET Core RC1, điều này có trong Microsoft.AspNet.Http.Extensions)

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

var url = httpContext.Request.GetEncodedUrl();

hoặc là

var url = httpContext.Request.GetDisplayUrl();

tùy theo mục đích.


ASP.NET Core RC2 hiện có sẵn không?
Sergey G.


Nhìn vào nguồn, chúng rõ ràng thực hiện một số mã hóa / giải mã nên đây sẽ không phải là url thô. Ngoài ra, IIS sẽ thay đổi đôi khi thay đổi url trước khi nó đến Kestrel, ví dụ% 2F -> /.
Daniel Leach

1
@TomStickel Không chắc bạn đang nói gì ... Tôi không gặp vấn đề gì khi sử dụng một trong hai. Đảm bảo rằng bạn có usingchỉ thị trong tệp của mình như được mô tả trong câu trả lời, vì đây không phải là các phương thức "bình thường", mà là các phương thức mở rộng.
Nick Mertin

1
@TomStickel hội chợ. Chỉ cần lưu ý rằng với Microsoft.AspNetCore.All gói được cài đặt cho ASP.NET Core 2.2 (cũng được thử nghiệm trên 2.0), điều này hoạt động tốt đối với tôi.
Nick Mertin

16

Nếu bạn thực sự muốn có URL thô, thực , 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 thức này sử dụng RawTargetyêu cầu không được hiển thị trên HttpRequestchính đối tượng. Thuộc tính này đã được thêm vào bản phát hành 1.0.0 của ASP.NET Core. Đảm bảo rằng bạn đang chạy phiên bản đó hoặc phiên bản mới hơn.

GHI CHÚ! Thuộc tính này để lộ URL thô , vì vậy nó chưa được giải mã, như tài liệu đã lưu ý:

Thuộc tính này không được sử dụng nội bộ cho các quyết định định tuyến hoặc ủy quyền. Nó chưa được UrlDecoded và nên cẩn thận khi sử dụng.


Tôi đang sử dụng ASP .NET Core với .NET Framework đầy đủ. Điều này dường như không hiệu quả với tôi ( RawTargetkhông được xác định trên IHttpRequestFeature). Bạn có thể nghĩ ra một giải pháp thay thế không?
Tomáš Hübelbauer

1
RawTargetđã được thêm vào bản phát hành 1.0, trở lại vào tháng 5 . Bạn có chắc mình đang chạy trên phiên bản mới nhất không?
khellang

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

Đây là câu trả lời có thẩm quyền.
Chris Marisic

Điều này dường như cung cấp cho Đường dẫn URL thay vì toàn bộ URL
Iain Ballard

10

Trong .NET Core dao cạo:

@using Microsoft.AspNetCore.Http.Extensions
@Context.Request.GetEncodedUrl() //Use for any purpose (encoded for safe automation)

Bạn cũng có thể sử dụng thay cho dòng thứ hai:

@Context.Request.GetDisplayUrl() //Use to display the URL only

8

Các giải pháp khác không phù hợp với nhu cầu của tôi vì tôi muốn trực tiếp một URIđối tượng và tôi nghĩ tốt hơn là tránh nối chuỗi (cũng) trong trường hợp này, vì vậy tôi đã tạo các phương thức mở rộng này hơn là sử dụng a UriBuildervà cũng hoạt động với các url như http://localhost:2050:

public static Uri GetUri(this HttpRequest request)
{
    var uriBuilder = new UriBuilder
    {
        Scheme = request.Scheme,
        Host = request.Host.Host,
        Port = request.Host.Port.GetValueOrDefault(80),
        Path = request.Path.ToString(),
        Query = request.QueryString.ToString()
    };
    return uriBuilder.Uri;
}

1
Tốt. Ngoài ra, tôi đã cải thiện giải pháp của bạn với các thông số tùy chọn. Do đó, tôi có thể kiểm soát phần nào của URI mà tôi muốn truy xuất. Ví dụ, máy chủ chỉ hoặc đường dẫn đầy đủ mà không cần chuỗi truy vấn, vv
user3172616

@ user3172616 ý kiến ​​hay!
giammin

1
(80)nên được (-1). Khi bạn có lược đồ https với cổng bị bỏ qua trong tiêu đề "Máy chủ lưu trữ", điều này sẽ tạo ra Uri sai (ví dụ: https://myweb:80/với (-1)nó sẽ như vậy https://myweb).
Igor Dražić

4

Phương thức mở rộng sau đây tái tạo logic từ trước bản 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.QueryString;
}

3

Tiện ích mở rộng này phù hợp với 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}";
        }
    }

0

Trong ASP.NET 5 beta5:

Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
    request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.