无法使用OWIN Self Host关闭并启动新的SignalR

Geo*_*uer 5 signalr owin

在1.5周的重构结束时,这是一堵墙.

我已经把它降到最低限度,我绝对亏损

我使用owin selfhost(katana)启动SignalR网络服务器,连接到它.我关闭它,然后我启动它并尝试再次连接它.

第二次通过(第一次工作正常)我尝试启动连接时出错:

public partial class App : Application
{

    void App_Startup(object sender, StartupEventArgs e)
    {
        using (var server = new TestWebServer()) {
            server.Start();
            using (var hubConnection = new HubConnection(TestWebServer.Host)) {
                var proxy = hubConnection.CreateHubProxy("testHub");
                hubConnection.Start().Wait();
                Debug.Assert(hubConnection.State == ConnectionState.Connected);
            }
        }

        // Makes it here fine

        using (var server = new TestWebServer()) {
            server.Start();
            using (var hubConnection = new HubConnection(TestWebServer.Host)) {
                var proxy = hubConnection.CreateHubProxy("testHub");
                hubConnection.Start().Wait(); //<-throws "Transport timed out trying to connect"
                Debug.Assert(hubConnection.State == ConnectionState.Connected);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

TestWebServer:

public class TestWebServer : IDisposable {
    public const string Host = "http://localhost:8081/";
    public void Start() {
        if (null != server) return;
        this.server = WebApp.Start(Host, app => {
            var cfg = new HubConfiguration { };
            app.MapSignalR(cfg);
        });
    }
    IDisposable server;

    //Super-duper-for-real disposable https://lostechies.com/chrispatterson/2012/11/29/idisposable-done-right/
    bool _disposed;
    public void Dispose() {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    ~TestWebServer() {
        Dispose(false);
    }
    protected virtual void Dispose(bool disposing) {
        if (_disposed)
            return;
        if (disposing) {
            if (null == server) return;
            server.Dispose();
            server = null;
        }
        _disposed = true;
    }

}
Run Code Online (Sandbox Code Playgroud)

TestHub

[HubName("testHub")]
public class TestHub : Hub {
    public void Ping() => Clients.All.pong();
}
Run Code Online (Sandbox Code Playgroud)

这是使用SignalR 2.2.0,我在.Net 4.5和4.6.1上都尝试过

这是一个简单的SignalR应用程序,因为我可能知道如何制作它,你注意到它的工作原理!一旦.然后当我处理并再次尝试完全相同的代码时它失败了.

到底是怎么回事?处理事情我还需要做些什么吗?

是的,我试过Thread.Sleep两者之间.

这是一个测试项目,展示了这个问题

Geo*_*uer 7

所有这些都归功于我的同事Shamus,他发现了这篇文章然后对我的演示项目感到怀疑,直到最糟糕的事情发生.

如果每次都提供HubConfiguration一个新实例,则Resolver可以停止并重新启动.换句话说,在源代码中检查这个废话.

换句话说,就是这样

var cfg = new HubConfiguration { Resolver = new DefaultDependencyResolver() };
Run Code Online (Sandbox Code Playgroud)

度过一段美好时光.

SO什么,似乎像此刻是存储在依赖解析器的东西没有被妥善处理.(由于在Web服务器处理期间发生异常并且记录到Debug输出,因此这种怀疑更加突出.如果你不是每次都手动创建自己的解析器那么...祝贺你,你只是抓住包含不正确处置的对象的同一个全局解析器.

所以答案似乎是肯定的,这是一个SignalR错误,但也是,有一个简单的解决方法.