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

时间:2016-06-16 22:05:38

标签: 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);
            }
        }
    }
}

使用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;
    }

}

TestHub

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

这是使用SignalR 2.2.0,我已经尝试过.Net 4.5和4.6.1

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

发生了什么事?处理事情我还需要做些什么吗?

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

Here is a tester project demonstrating the issue

1 个答案:

答案 0 :(得分:6)

所有信用都归功于我的同事Shamus,他发现this article然后对我的演示项目感到怀疑,直到这件事情发生了。

如果每次HubConfiguration都为Resolver提供<{1}},则可以停止并重新启动。换句话说check this nonsense out in the source

在其他方面,换句话说,做

var cfg = new HubConfiguration { Resolver = new DefaultDependencyResolver() };

度过一段美好时光。

SO 目前的情况是,存储在依赖项解析程序中的内容未正确处理。 (由于在Web服务器处理期间发生异常并且记录到Debug输出,因此这种怀疑更加突出。如果你不是每次都手动创建自己的解析器那么......恭喜你,你只是抓住包含不正确处理对象的同一个全局解析器。

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