在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两者之间.
所有这些都归功于我的同事Shamus,他发现了这篇文章然后对我的演示项目感到怀疑,直到最糟糕的事情发生.
如果每次都提供HubConfiguration一个新实例,则Resolver可以停止并重新启动.换句话说,在源代码中检查这个废话.
换句话说,就是这样
var cfg = new HubConfiguration { Resolver = new DefaultDependencyResolver() };
Run Code Online (Sandbox Code Playgroud)
度过一段美好时光.
SO什么,似乎像此刻是存储在依赖解析器的东西没有被妥善处理.(由于在Web服务器处理期间发生异常并且记录到Debug输出,因此这种怀疑更加突出.如果你不是每次都手动创建自己的解析器那么...祝贺你,你只是抓住包含不正确处置的对象的同一个全局解析器.
所以答案似乎是肯定的,这是一个SignalR错误,但也是,有一个简单的解决方法.
| 归档时间: |
|
| 查看次数: |
691 次 |
| 最近记录: |