이것은 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
두 사람 사이에 시도했습니다 .
이 기사 를 찾은 내 동료 Shamus에게 모든 공로를 인정했고 그게 성공할 때까지 내 데모 프로젝트를 해킹 할만큼 의심했습니다.
매번 새 인스턴스 를 제공하면HubConfiguration
Resolver
중지하고 다시 시작할 수 있습니다 . 즉 , 소스에서이 넌센스를 확인하십시오 .
즉, do
var cfg = new HubConfiguration { Resolver = new DefaultDependencyResolver() };
모든 것을 고치는 좋은 시간 동안.
SO 무엇을이 순간처럼 보인다 제대로 처리되지 않는 종속성 해결에 저장되어있는 그 무언가이다. (이 의심은 웹 서버 폐기 중에 발생하는 예외가 발생하고 디버그 출력에 기록된다는 사실로 인해 더욱 심해졌습니다.) 매번 수동으로 자체 리졸버를 생성하지 않으면 ... 축하합니다. 부적절하게 처리 된 객체를 포함하는 동일한 글로벌 리졸버를 잡는 것입니다.
그래서 대답은 예, 이것은 SignalR 버그이지만 예, 간단한 해결 방법이 있다는 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다