迁移旧ASP.NET到.NET8 Core时SystemWebAdapters使用疑问及POC需求
问题解答与POC实现
一、核心疑问解答
不需要自行编写AspNetCoreHttpContextAdapter和SystemWebHttpContextAdapter这两个自定义适配器类。Microsoft.AspNetCore.SystemWebAdapters本身已经内置了成熟的适配机制,能够自动完成旧ASP.NET的System.Web.HttpContext与ASP.NET Core的Microsoft.AspNetCore.Http.HttpContext之间的转换与映射,无需重复实现适配逻辑。
二、POC实现步骤
1. 调整.NET Standard 2.0共享库(OldHandlers)
确保共享库引用Microsoft.AspNetCore.SystemWebAdapters.Abstractions包(支持.NET Standard 2.0),基于你已有的结构调整代码:
// IHttpContextAdapter.cs using System.Collections.Specialized; namespace OldHandlers { public interface IHttpContextAdapter { NameValueCollection RequestHeaders { get; } string RequestPath { get; } void SetResponseStatus(int statusCode); void WriteResponse(string content); } } // MyHandler.cs namespace OldHandlers { public class MyHandler { private readonly IHttpContextAdapter _contextAdapter; public MyHandler(IHttpContextAdapter contextAdapter) { _contextAdapter = contextAdapter; } public void ProcessRequest() { var userAgent = _contextAdapter.RequestHeaders["User-Agent"]; _contextAdapter.SetResponseStatus(200); _contextAdapter.WriteResponse($"Processed request from: {userAgent}, Path: {_contextAdapter.RequestPath}"); } } }
2. 旧ASP.NET网站配置
- 引用共享库
OldHandlers,安装Microsoft.AspNetCore.SystemWebAdapters包。 - 在
Global.asax.cs中注册服务,将内置适配类映射到自定义接口:
using OldHandlers; using Microsoft.AspNetCore.SystemWebAdapters; using System.Web.Mvc; using Autofac; using Autofac.Integration.Mvc; namespace OldAspNetSite { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); // 初始化SystemWebAdapters SystemWebAdaptersBuilder.UseSystemWebAdapters(this) .AddJsonSessionSerializer(options => { options.RegisterKey<string>("SampleKey"); }) .Build(); // 依赖注入配置 var builder = new ContainerBuilder(); builder.RegisterControllers(typeof(MvcApplication).Assembly); // 绑定内置适配类到自定义接口 builder.RegisterType<SystemWebHttpContextAdapter>().As<IHttpContextAdapter>().InstancePerHttpRequest(); builder.RegisterType<MyHandler>().InstancePerHttpRequest(); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); } } }
- 测试Controller:
using OldHandlers; using System.Web.Mvc; namespace OldAspNetSite.Controllers { public class HomeController : Controller { private readonly MyHandler _handler; public HomeController(MyHandler handler) { _handler = handler; } public ActionResult Index() { _handler.ProcessRequest(); return new EmptyResult(); } } }
3. ASP.NET Core 8 MVC应用配置
- 引用共享库
OldHandlers,安装Microsoft.AspNetCore.SystemWebAdapters包。 - 在
Program.cs中配置服务与中间件:
using OldHandlers; using Microsoft.AspNetCore.SystemWebAdapters; var builder = WebApplication.CreateBuilder(args); // 添加SystemWebAdapters服务 builder.Services.AddSystemWebAdapters() .AddJsonSessionSerializer(options => { options.RegisterKey<string>("SampleKey"); }); // 绑定内置上下文访问器到自定义接口 builder.Services.AddScoped<IHttpContextAdapter>(sp => { var accessor = sp.GetRequiredService<IHttpContextAccessor>(); return new AspNetCoreHttpContextAdapter(accessor.HttpContext); }); builder.Services.AddScoped<MyHandler>(); builder.Services.AddControllersWithViews(); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); // 启用SystemWebAdapters中间件 app.UseSystemWebAdapters(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
- 实现轻量适配类(仅包装内置逻辑):
using Microsoft.AspNetCore.Http; using OldHandlers; using System.Collections.Specialized; namespace AspNetCore8MvcApp { public class AspNetCoreHttpContextAdapter : IHttpContextAdapter { private readonly HttpContext _context; public AspNetCoreHttpContextAdapter(HttpContext context) { _context = context; } public NameValueCollection RequestHeaders { get { var headers = new NameValueCollection(); foreach (var header in _context.Request.Headers) { headers.Add(header.Key, header.Value); } return headers; } } public string RequestPath => _context.Request.Path.ToString(); public void SetResponseStatus(int statusCode) { _context.Response.StatusCode = statusCode; } public async void WriteResponse(string content) { await _context.Response.WriteAsync(content); } } }
- 测试Controller:
using Microsoft.AspNetCore.Mvc; using OldHandlers; namespace AspNetCore8MvcApp.Controllers { public class HomeController : Controller { private readonly MyHandler _handler; public HomeController(MyHandler handler) { _handler = handler; } public IActionResult Index() { _handler.ProcessRequest(); return new EmptyResult(); } } }
4. 验证测试
分别启动旧ASP.NET网站和ASP.NET Core 8应用,访问各自的Home/Index接口,均可正常输出基于HttpContext处理的响应内容,说明共享库在两个环境中均能正常工作。
内容的提问来源于stack exchange,提问作者tRuEsAtM
相关产品推荐
相关产品推荐

