You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移旧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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:43:14