1

我的代码库现在卡在 .Net 4.7.2 中,但我需要在基于 Asp.Core 2.2 的网站上推送一些通知。

在整个系统中,我们使用 SignalR 2.4.1,但它完全用 .Net Core 重写。

我尝试在同一个应用程序中托管它但没有成功。欧文似乎并不高兴。

有没有人有任何成功或有任何建议?

必须有一种方法可以让项目从 .Net 迁移到 Core。谢谢

4

1 回答 1

1

好吧,过了一夜,我找到了解决这个问题的办法。

首先只是为了让我的设置清晰。有一个针对 .Net 4.7.2 的 API 项目,它通过 SignalR 2.4.1 集线器广播一些消息。还有一些其他的 Asp.Net 4.7.2 项目正在使用那些运行良好的集线器。还有一个在 .Net Core 中构建的新网站,但针对 4.7.2 框架。

我最终得到的解决方案本质上是在 AspCore 管道中托管一个 OWIN 管道。

首先,我需要安装以下软件包:

  • 微软.Owin
  • Microsoft.AspNetCore.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 管道添加更多中间件。

我希望这有帮助。

于 2020-02-28T10:41:33.663 回答