AspNetCore.Owin中.NET Framework Owin WebApp.Start等效实现
.NET Framework OWIN 自托管代码在 ASP.NET Core 环境下的等效实现
首先明确:官方提供的Microsoft.AspNetCore.Owin包仅实现OWIN规范与ASP.NET Core中间件管道的互操作,不存在无需经过ASP.NET Core中间件即可独立启动OWIN Web主机的官方实现。
你原有的WPF自托管Web接口逻辑,可以通过两种方式迁移到.NET Core/.NET 5+环境:
方案1:使用ASP.NET Core Kestrel自托管(官方推荐)
这个方案不需要兼容旧OWIN管道,直接用ASP.NET Core原生轻量主机实现和原有逻辑完全一致的功能,性能更好、长期维护性更强,是首选方案。
前置依赖
- 安装NuGet元包
Microsoft.AspNetCore.App - 如果需要兼容旧ASP.NET Web API 2的路由、参数绑定行为,可以额外安装
Microsoft.AspNetCore.Mvc.WebApiCompatShim
代码实现
首先替换原WebApp.Start的启动逻辑:
// 替换原 _server = WebApp.Start(hostingUrl.AbsoluteUri, ServerConfiguration); var webAppBuilder = WebApplication.CreateBuilder(); // 配置监听地址 webAppBuilder.WebHost.UseUrls(hostingUrl.AbsoluteUri); // 注册服务,对应原ServiceCollection配置逻辑 ConfigureServices(webAppBuilder.Services); var app = webAppBuilder.Build(); // 配置路由与中间件,对应原UseWebApi逻辑 Configure(app); // 异步启动服务,_server可存为Task类型,程序退出时调用StopAsync即可优雅关闭 _server = app.RunAsync();
服务注册逻辑和原代码几乎完全对应,不需要自定义依赖解析器,ASP.NET Core原生DI容器直接接管控制器激活:
private void ConfigureServices(IServiceCollection services) { // 启用控制器支持 var mvcBuilder = services.AddControllers(); // 以下注册逻辑和原代码完全一致 services.AddSingleton<IFHIRWebhookClient>(this); services.AddTransient<CallbackController>(); services.AddSingleton(_logger); services.AddSingleton<ISubscriptionManager>(_subscriptionManager); services.AddSingleton(_configuration); services.AddSingleton<IRSAKeyReader, RSAKeyReader>(); // 注册额外自定义控制器 if (_configuration.AdditionalControllers != null && _configuration.AdditionalControllers.Any()) { // 将额外控制器所在程序集加入应用部件扫描范围,确保MVC能识别到控制器 foreach (var controllerType in _configuration.AdditionalControllers) { mvcBuilder.AddApplicationPart(controllerType.Assembly); services.AddTransient(controllerType); } } // 如需兼容旧Web API的约定,可启用兼容模式 // mvcBuilder.AddWebApiConventions(); }
路由配置和原WebApi路由规则完全对齐:
private void Configure(WebApplication app) { // 对应原"API Default"路由规则,默认路由到Callback控制器,clientId为可选参数 app.MapControllerRoute( name: "API Default", pattern: "{controller=Callback}/{clientId?}" ); }
方案2:复用现有OWIN配置代码(第三方实现)
如果你不想修改原有ServerConfiguration中的IAppBuilder配置逻辑,可以使用社区维护的第三方OWIN服务器Nowin,它不依赖ASP.NET Core管道,可以直接在.NET Core环境下运行OWIN兼容代码,使用方式和原WebApp.Start几乎一致。
前置依赖
- 安装NuGet包
Nowin
代码实现
using Nowin; // 直接复用原有的ServerConfiguration方法,不需要做任何修改 _server = ServerBuilder.New() .SetUrl(hostingUrl.AbsoluteUri) .SetOwinApp(ServerConfiguration) .Build(); _server.Start();
注意:Nowin为非官方社区项目,更新迭代速度慢,性能和稳定性弱于Kestrel,仅适合需要最大程度复用旧OWIN代码的临时场景使用。
内容的提问来源于stack exchange,提问作者Bill Tarbell
相关产品推荐
相关产品推荐

