UnlimitedOperationException: Không thể giải quyết dịch vụ cho loại 'Microsoft.AspNetCore.Http.IHttpContextAccessor'


137

Tôi bắt đầu chuyển đổi dự án RC1 lõi asp.net của mình sang RC2 và gặp phải vấn đề IHttpContextAccessorhiện chưa được giải quyết.

Để đơn giản, tôi đã tạo dự án ASP.NET RC2 mới bằng Visual Studio Template ASP.NET Core Web Application (.Net Framework). Hơn tôi đã thêm constructor cho HomeContoder mà mẫu được tạo cho tôi.

public HomeController(IHttpContextAccessor accessor)
{
}

Và sau khi tôi bắt đầu ứng dụng, tôi nhận được lỗi tiếp theo:

UnlimitedOperationException: Không thể giải quyết dịch vụ cho loại 'Microsoft.AspNetCore.Http.IHttpContextAccessor' trong khi cố gắng kích hoạt 'TestNewCore.Controllers.HomeControll'. Microsoft Microsoft.Extensions.I Internalal.ActivatorUtilities.GetService (IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)

Trong ứng dụng thực tế của mình, tôi cần giải quyết IHttpContextAccessortrong lớp dịch vụ của riêng mình để có quyền truy cập _contextAccessor.HttpContext.Authenticationvà đến _contextAccessor.HttpContext.User. Everet Breath hoạt động tốt trong RC1. Vì vậy, làm thế nào nó có thể giả sử là trong RC2?


Vấn đề này đã được thảo luận trên kho lưu trữ GitHub của aspnet tại đây: github.com/aspnet/hosting/issues/793
Chris Pickford

Câu trả lời:


217

IHttpContextAccessor không còn được kết nối theo mặc định, bạn phải tự đăng ký nó

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

7
Nó được làm việc. Cũng câu chuyện tương tự vớiservices.AddScoped<IActionContextAccessor, ActionContextAccessor>()
YuriyP

6
Chúng ta có một khuyến nghị chính thức về phạm vi thích hợp là gì? Nó nên Singleton, Scopedhay Transient?
Đánh dấu Vincze

9
Ah nó đã được thảo luận ở đây, và nhiều người xác minh nó có thể an toàn Singleton. github.com/aspnet/hosting/issues/793
Đánh dấu Vincze

Khi làm điều đó, tôi đã nhận được lỗi này : InvalidOperationException: Cannot consume scoped service. Bất kỳ ý tưởng ?
Robouste

1
Vui lòng xem câu trả lời tiếp theo về việc sử dụng phương thức tiện ích mở rộng được cung cấp được services.AddHttpContextAccessor()Microsoft ưu tiên / khuyến nghị.
Martin Bliss

120

Kể từ .NET Core 2.1, có một phương thức mở rộng đã được thêm vào để đăng ký chính xác IHttpContextAccessormột đơn vị. Xem Thêm người trợ giúp để đăng ký IHttpContextAccessor # 947 . Chỉ cần thêm như sau trong ConfigureServices()phương thức của bạn :

services.AddHttpContextAccessor();

Điều này tương đương với:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
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.