Клиент SignalR .NET не может завершить рукопожатие - PullRequest
3 голосов
/ 30 марта 2019

Я использую AspNetCore.SignalR 1.1.0 и AspNetCore.SignalR.Client 1.1.0.У меня есть клиент .NET (приложение WPF), который работает правильно при подключении к веб-приложению, работающему на локальном хосте, но когда я пытаюсь подключиться к тому же веб-приложению, пока оно работает в промежуточной среде (IIS в Azure), он не можетзавершить рукопожатие.Я новичок в SignalR и не могу определить причину сбоя.

Вот соединение в клиенте .NET:

//Create the connection
connection = new HubConnectionBuilder()
    .WithUrl(await ClientDataStore.ParseRouteAsync(Routes.POSFullSync), options =>
    {
        options.AccessTokenProvider = async () => await Task.FromResult(await ClientDataStore.GetAccessTokenAsync());
        options.Headers.Add("X-Vending-Outlet-Id", KeyApplicationVariables.VOInstanceId.ToString());
    })
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Trace);
        logging.AddConsole();
    })
    .Build();

await connection.StartAsync();
//Fails here with Operation was cancelled

Вот конфигурация в веб-приложении.

//Add signalR
services.AddSignalR(hubOptions =>
{
    hubOptions.EnableDetailedErrors = true;
    hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});

//Configure signalr
app.UseSignalR(routes =>
{
    routes.MapHub<POSFullSyncHub>(Routes.POSFullSync);
    routes.MapHub<POSPartialSyncHub>(Routes.POSPartialSync);
});

Я включил ведение журнала SignalR, а также посмотрел с помощью Fiddler, но похоже, что клиент просто останавливается до завершения рукопожатия.

Вот некоторые записи на клиенте

dbug: Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[18]
      Transport 'WebSockets' started.
info: Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[3]
      HttpConnection Started.
info: Microsoft.AspNetCore.SignalR.Client.HubConnection[24]
      Using HubProtocol 'json v1'.
dbug: Microsoft.AspNetCore.SignalR.Client.HubConnection[28]
      Sending Hub Handshake.
dbug: Microsoft.AspNetCore.Http.Connections.Client.Internal.WebSocketsTransport[13]
      Received message from application. Payload size: 32.
The thread 0x3ca4 has exited with code 0 (0x0).
fail: Microsoft.AspNetCore.SignalR.Client.HubConnection[35]
      Error processing the handshake response.
System.OperationCanceledException: The operation was canceled.
   at System.Threading.CancellationToken.ThrowOperationCanceledException()
   at System.IO.Pipelines.Pipe.GetReadResult(ReadResult& result)
   at System.IO.Pipelines.Pipe.GetReadAsyncResult()
   at System.IO.Pipelines.Pipe.DefaultPipeReader.GetResult(Int16 token)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at Microsoft.AspNetCore.SignalR.Client.HubConnection.<HandshakeAsync>d__61.MoveNext()
fail: Microsoft.AspNetCore.SignalR.Client.HubConnection[43]
      Error starting connection.
System.OperationCanceledException: The operation was canceled.
   at System.Threading.CancellationToken.ThrowOperationCanceledException()
   at System.IO.Pipelines.Pipe.GetReadResult(ReadResult& result)
   at System.IO.Pipelines.Pipe.GetReadAsyncResult()
   at System.IO.Pipelines.Pipe.DefaultPipeReader.GetResult(Int16 token)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at Microsoft.AspNetCore.SignalR.Client.HubConnection.<HandshakeAsync>d__61.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.SignalR.Client.HubConnection.<StartAsyncCore>d__47.MoveNext()

Он работает на локальном хосте IIS Express в VS, но похоже, что сбой происходит на стороне клиента.Когда я запускаю то же приложение WPF в режиме отладки VS, но подключаюсь к идентичной версии приложения на IIS 10 в Azure, происходит сбой.Что я пропустил?

Как определить причину неудачного завершения рукопожатия?

ОБНОВЛЕНИЕ:

Мне удалось определить, что что-то есть в сетипотенциально может вызвать проблему, т.е. он работает в моей домашней сети, но не при использовании сети на месте.Поскольку я не владею сетью, в которой происходит сбой этого приложения, мне может потребоваться указать требования к администратору.Каковы сетевые требования для SignalR?и как я мог подтвердить эту теорию?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...