Sự khác biệt giữa HttpRequest.Path và HttpRequest.PathBase trong ASP.NET Core là gì?


8

Như đã trình bày ở đây: https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.httprequest?view=aspnetcore-3.0 , của ASP.NET Lõi HttpRequestlớp bao gồm cả PathPathBasetài sản.

Sự khác biệt giữa hai tính chất này là gì? Mỗi cái dùng để làm gì? Ý nghĩa của nó là PathBasegì? Tầm quan trọng của việc có cả a Pathvà a là PathBasegì?

Tôi không thể tìm thấy bất kỳ tài liệu chi tiết tại sao nó là như vậy - bất kỳ ý tưởng?

Câu trả lời:


14

Trong lõi ASP.NET có khái niệm này được gọi là cơ sở đường dẫn . Ý tưởng cơ bản khá dễ hiểu: cơ sở đường dẫn được coi là tiền tố cố định cho đường dẫn của tất cả các yêu cầu đến ứng dụng web của bạn. Theo mặc định, cơ sở đường dẫn được coi là chuỗi rỗng.

Điều này có nghĩa là theo mặc định, khi một yêu cầu vào ứng dụng của bạn, tất cả phần đường dẫn của URL của yêu cầu sẽ được ánh xạ tới thuộc Pathtính của HttpRequestđối tượng và thuộc PathBasetính sẽ được đặt thànhstring.empty .

Như một ví dụ, hãy xem xét một ứng dụng lõi asp.net đang chạy trong máy cục bộ của bạn và lắng nghe cổng 3000. Giả sử rằng bạn đang chạy ứng dụng bằng cách sử dụng máy chủ web kestrel thô (vì vậy không có proxy ngược liên quan, yêu cầu đến trực tiếp với kestrel).

Khi bạn yêu cầu URL http://localhost:3000/foo/barthì HttpRequestđối tượng sẽ có các thuộc tính sau:

  • HttpRequest.Path sẽ được đặt thành /foo/bar
  • HttpRequest.PathBase sẽ được đặt thành string.empty

Bạn sẽ gặp tình huống tương tự khi bạn quyết định lưu trữ ứng dụng của mình trên Azure, bằng cách sử dụng dịch vụ ứng dụng windows.

Trong kịch bản lưu trữ này, mặc định cho một ứng dụng web lõi ASP.NET đang được thực thi bên trong cùng quy trình với quy trình công nhân IIS. Điều này về cơ bản có nghĩa là chỉ có một quá trình liên quan; một lần nữa, không có proxy ngược và máy chủ web kestrel hoàn toàn không được sử dụng: yêu cầu được xử lý trực tiếp bởi IIS (bạn có thể tìm thấy một số chi tiết ở đây nếu bạn quan tâm).

Trong trường hợp đó, URL công khai cho ứng dụng của bạn sẽ giống như thế https://my-application.azurewebsites.net. Khi bạn duyệt đến URL https://my-application.azurewebsites.net/foo/bar, tình huống cho yêu cầu http đến sẽ như sau:

  • HttpRequest.Path sẽ được đặt thành /foo/bar
  • HttpRequest.PathBase sẽ được đặt thành string.empty

Một lần nữa, như trước, cơ sở đường dẫn là chuỗi rỗng.

Có nhiều kịch bản lưu trữ khác nhau trong đó bạn có thể quyết định hiển thị ứng dụng của mình bằng cách sử dụng một thư mục ảo.

Chẳng hạn, bạn có thể quyết định lưu trữ ứng dụng web lõi asp.net trong trung tâm dữ liệu của riêng bạn bằng cách sử dụng máy ảo windows có cài đặt IIS. Trong trường hợp đó, bạn có thể có một trang web hiện có trong IIS và bạn muốn tạo một ứng dụng ảo có bí danh phù hợp trong trang web đó. Một lần nữa trong kịch bản này, như đã giải thích ở trên cho dịch vụ ứng dụng windows azure, không có proxy ngược nào liên quan và máy chủ web kestrel hoàn toàn không được sử dụng: yêu cầu được xử lý trực tiếp bởi quy trình công nhân IIS ( trong mô hình lưu trữ quy trình ).

Giả sử rằng URL công khai của trang web của bạn là https://sample-application.contoso.netvà bạn đã chọn sample-aliasbí danh cho ứng dụng ảo. Điều này ngụ ý rằng tất cả các yêu cầu cho ứng dụng web lõi asp.net của bạn sẽ có một phần đường dẫn bắt đầu bằng sample-alias. Chẳng hạn, khi bạn muốn yêu cầu trang chủ của ứng dụng, bạn sẽ duyệt đến https://sample-application.contoso.net/sample-alias.

Trong trường hợp này khi bạn yêu cầu URL https://sample-application.contoso.net/sample-alias/foo/bar, HttpRequestđối tượng trong ứng dụng của bạn sẽ được thực hiện theo cách sau:

  • HttpRequest.Path sẽ được đặt thành /foo/bar
  • HttpRequest.PathBase sẽ được đặt thành sample-alias

Do cách xây dựng máy chủ web mặc định cho ứng dụng lõi ASP.NET, kịch bản này liên quan đến các ứng dụng ảo IIS hoạt động tốt và đường ống phần mềm trung gian nhận biết tiền tố chung cho tất cả các yêu cầu HTTP đến và nó có thể đặt cơ sở đường dẫn thành sample-aliasvà thuộc tính đường dẫn thành phần còn lại của đường dẫn yêu cầu đến ( /foo/bartrong ví dụ của tôi ở trên).

Theo nguyên tắc thông thường, bạn có thể xem xét rằng một ứng dụng web lõi ASP.NET hoạt động tốt mà không cần bất kỳ cấu hình bổ sung nào khi bạn muốn lưu trữ nó bằng cách sử dụng IIS. Điều này cũng đúng với thuộc tính cơ sở đường dẫn (kiểm tra ở đây để xác minh rằng đường dẫn cơ sở yêu cầu được đặt tự động bên trong ứng dụng của bạn khi phân tầng).

Như một ví dụ cuối cùng, hãy xem xét việc lưu trữ ứng dụng của bạn trên máy Linux, bằng cách sử dụng nginx làm proxy ngược. Trong trường hợp này, ứng dụng của bạn sẽ được thực thi bên trong máy chủ web kestrel, nhưng nó sẽ không được tiếp xúc trực tiếp với internet công cộng. Thứ được tiếp xúc với internet công cộng là máy chủ web nginx định tuyến các yêu cầu HTTP đến tới máy chủ web kestrel (nơi ứng dụng của bạn được thực thi). Bạn có thể quyết định định cấu hình nginx của mình để tất cả các yêu cầu bắt đầu bằng tiền tố /awesome-applicationsẽ được chuyển đến ứng dụng web lõi asp.net của bạn.

Ví dụ: giả sử hiển thị nginx với internet công cộng tại URL https://ingress.contoso.net: trong trường hợp này nếu bạn muốn yêu cầu trang chủ của ứng dụng bạn cần duyệt đến https://ingress.contoso.net/awesome-application/.

Trong trường hợp này, bạn không thể có được awesome-applicationcơ sở đường dẫn yêu cầu miễn phí (theo mặc định, kestrel không biết về nó và nó coi cơ sở đường dẫn yêu cầu là string.empty).

Để làm cho kestrel nhận thức được cơ sở đường dẫn yêu cầu, bạn cần sử dụng UsePathBaseMiddleware làm mục đầu tiên trong đường dẫn phần mềm trung gian của bạn.

Nếu bạn cần thêm chi tiết cho trường hợp này, hãy làm theo tài liệu này và xem thêm câu hỏi stackoverflow này .


1
Có thêm một chút về điều này: Sử dụng, Chạy và Bản đồ . Ví dụ: Khi Mapđược sử dụng, các phân đoạn đường dẫn phù hợp sẽ bị xóa khỏi HttpRequest.Pathvà được thêm vào HttpRequest.PathBasecho mỗi yêu cầu. .
Kirk Larkin
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.