InvalidOperationException: ไม่สามารถแก้ไขบริการสำหรับประเภท 'Microsoft.AspNetCore.Http.IHttpContextAccessor'


148

ฉันเริ่มแปลงโครงการ RC1 หลักของ asp.net เป็น RC2 และประสบกับปัญหาที่IHttpContextAccessorไม่สามารถแก้ไขได้ในขณะนี้

เพื่อประโยชน์ของความเรียบง่ายที่ฉันสร้างโครงการ ASP.NET RC2 ASP.NET Core Web Application (.Net Framework)ใหม่โดยใช้แม่แบบ ฉันเพิ่มตัวสร้างสำหรับ HomeController ซึ่งเทมเพลตที่สร้างขึ้นสำหรับฉัน

public HomeController(IHttpContextAccessor accessor)
{
}

และหลังจากฉันเริ่มแอปพลิเคชันฉันได้รับข้อผิดพลาดถัดไป:

InvalidOperationException: ไม่สามารถแก้ไขบริการสำหรับชนิด 'Microsoft.AspNetCore.Http.IHttpContextAccessor' ในขณะที่พยายามเปิดใช้งาน 'TestNewCore.Controllers.HomeController' ใน Microsoft.Extensions.Internal.ActivatorUtilities.GetService (IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)

ในการประยุกต์ใช้จริงของฉันฉันต้องการที่จะแก้ปัญหาIHttpContextAccessorในระดับบริการของตัวเองสำหรับการเข้าถึงและ_contextAccessor.HttpContext.Authentication _contextAccessor.HttpContext.UserEverething ทำงานได้ดีใน RC1 แล้วมันจะอยู่ใน RC2 ได้อย่างไร?


ปัญหานี้ได้รับการกล่าวถึงในที่เก็บ aspnet GitHub ที่นี่: github.com/aspnet/Hosting/issues/793
Chris Pickford

คำตอบ:


234

IHttpContextAccessor ไม่ได้ต่อสายโดยค่าเริ่มต้นอีกต่อไปคุณต้องลงทะเบียนด้วยตัวเอง

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

8
มันใช้งานได้ เรื่องเดียวกันกับservices.AddScoped<IActionContextAccessor, ActionContextAccessor>()
YuriyP

6
เรามีคำแนะนำอย่างเป็นทางการเกี่ยวกับขอบเขตที่เหมาะสมหรือไม่? มันควรจะเป็นSingleton, ScopedหรือTransient?
Mark Vincze

9
Singletonอาก็กล่าวถึงที่นี่และคนหลายคนที่จะตรวจสอบได้อย่างปลอดภัยสามารถ github.com/aspnet/Hosting/issues/793
Mark Vincze

เมื่อทำเช่นนั้นฉันได้รับข้อผิดพลาดนี้: InvalidOperationException: Cannot consume scoped service. ความคิดใด ๆ ?
Robouste

2
โปรดดูคำตอบถัดไปเกี่ยวกับการใช้วิธีการขยายที่ให้มาservices.AddHttpContextAccessor()ซึ่งเป็นที่ต้องการ / แนะนำโดย Microsoft
Martin Bliss

129

ตั้งแต่. NET Core 2.1 มีวิธีการขยายที่เพิ่มเข้ามาเพื่อลงทะเบียนIHttpContextAccessorเป็นซิงเกิลตันอย่างถูกต้อง ดูเพิ่มผู้ช่วยในการลงทะเบียน IHttpContextAccessor # เพียงเพิ่มConfigureServices()วิธีการดังต่อไปนี้:

services.AddHttpContextAccessor();

สิ่งนี้เทียบเท่ากับ:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.