我的代码库现在卡在 .Net 4.7.2 中,但我需要在基于 Asp.Core 2.2 的网站上推送一些通知。
在整个系统中,我们使用 SignalR 2.4.1,但它完全用 .Net Core 重写。
我尝试在同一个应用程序中托管它但没有成功。欧文似乎并不高兴。
有没有人有任何成功或有任何建议?
必须有一种方法可以让项目从 .Net 迁移到 Core。谢谢
我的代码库现在卡在 .Net 4.7.2 中,但我需要在基于 Asp.Core 2.2 的网站上推送一些通知。
在整个系统中,我们使用 SignalR 2.4.1,但它完全用 .Net Core 重写。
我尝试在同一个应用程序中托管它但没有成功。欧文似乎并不高兴。
有没有人有任何成功或有任何建议?
必须有一种方法可以让项目从 .Net 迁移到 Core。谢谢
好吧,过了一夜,我找到了解决这个问题的办法。
首先只是为了让我的设置清晰。有一个针对 .Net 4.7.2 的 API 项目,它通过 SignalR 2.4.1 集线器广播一些消息。还有一些其他的 Asp.Net 4.7.2 项目正在使用那些运行良好的集线器。还有一个在 .Net Core 中构建的新网站,但针对 4.7.2 框架。
我最终得到的解决方案本质上是在 AspCore 管道中托管一个 OWIN 管道。
首先,我需要安装以下软件包:
我还为在同一管道上设置 OWIN 的 Core IApplicationBuilder 接口添加了一个新的扩展方法:
public static class OwinExtensions
{
public static IApplicationBuilder UseOwinApp(this IApplicationBuilder app, Action<IAppBuilder> configuration)
{
return app.UseOwin(setup => setup(next =>
{
IAppBuilder owinApp = new AppBuilder();
var aspNetCoreLifetime = (IApplicationLifetime)app.ApplicationServices.GetService(typeof(IApplicationLifetime));
var owinAppProperties = new AppProperties(owinApp.Properties)
{
OnAppDisposing = aspNetCoreLifetime?.ApplicationStopping ?? CancellationToken.None,
DefaultApp = next
};
configuration(owinApp);
return owinApp.Build<Func<IDictionary<string, object>, Task>>();
}));
}
}
然后在 Core 项目的Startup类中,在Configure方法中,我能够使用我的扩展并将 SignalR 集线器注册到它,如下所示:
启动.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseOwinApp(owinApp =>
{
owinApp.MapSignalR();
});
...
}
这样,如果出于任何原因需要,我们可以向 OWIN 管道添加更多中间件。
我希望这有帮助。