Тайм-аут сервера ASP.NET CORE 2.1 во время отладки

«Ошибка: время ожидания сервера истекло, а сообщение от сервера не получено».

Я пытаюсь отладить некоторый код на стороне сервера, и пока я это делаю, клиент отключается менее чем за минуту.

Я использую SignalR только для связи с клиентами, пока без контроллеров.

Есть ли какой-либо параметр, который может отключить тайм-аут или, по крайней мере, сделать его намного длиннее, чем сейчас?

мой запускSettings.json:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:26793",
      "sslPort": 44386
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_HTTPS_PORT": "44386"
      }
    },
    "Api": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_URLS": "https://localhost:5001;http://localhost:5000"
      }
    }
  }
}

person Arhire Ionut    schedule 13.04.2018    source источник
comment
Какой сервер, IIS Express + Kestrel? Это известная проблема. Попробуйте переключить профиль запуска на просто пустельгу.   -  person Tratcher    schedule 13.04.2018
comment
@Tratcher Я отредактировал сообщение и добавил свой файл launchSettings.json. Я думаю, что он запускает Kestrel только с учетом того, что говорится в документации: Когда приложение запускается с запуском dotnet, будет использоваться первый профиль с commandName: Project. Значение commandName указывает запускаемый веб-сервер. commandName может быть одним из: IIS Express; ИИС; Project (который запускает Kestrel) Итак, я предполагаю, что профиль Api будет использоваться с Kestrel, верно?   -  person Arhire Ionut    schedule 13.04.2018
comment
Имеет смысл. Если снова прочитать эту ошибку, похоже, что она исходит от клиента SignalR, а не от сервера.   -  person Tratcher    schedule 13.04.2018
comment
@Tratcher Я использую последнюю версию angular и signalR, я понятия не имею, в чем может быть проблема. Все равно спасибо :D   -  person Arhire Ionut    schedule 15.04.2018
comment
Вы все еще замечаете эту проблему? У меня похожая проблема, и я использую клиент JavaScript. Я не могу связать свой вопрос здесь, я думаю, но один из ответов на мой вопрос состоял в том, чтобы попытаться установить для HubConnection.ServerTimeout более высокое значение. Если вы используете клиент .NET, вы можете увидеть, поможет ли это?   -  person    schedule 17.05.2018
comment
Клиент @Kodathon тоже на javascript, но все равно спасибо.   -  person Arhire Ionut    schedule 17.05.2018
comment
@ArhireIonut Вы нашли решение?   -  person Mahmoud Farahat    schedule 06.06.2018
comment
@MahmoudFarahat this._hubConnection = new HubConnectionBuilder().withUrl('http://localhost:5000/match').build(); this._hubConnection.serverTimeoutInMilliseconds = 1000 * 1000; Я пытался увеличить serverTimeoutInMilliseconds, но не проверял это, потому что сейчас очень занят другими делами. Если вы попробуете это, и это сработает, пожалуйста, ответьте на мой пост соответствующим образом.   -  person Arhire Ionut    schedule 06.06.2018
comment
Да, это сработало для меня, теперь я могу отлаживать без проблем Большое спасибо ????   -  person Mahmoud Farahat    schedule 06.06.2018


Ответы (2)


Благодаря @Arhire Ionut

Вот как увеличить время ожидания клиента Javascript

hubConnection.serverTimeoutInMilliseconds = 100000; // 100 second

Подробнее здесь => https://github.com/aspnet/Docs/issues/6885

person Mahmoud Farahat    schedule 06.06.2018
comment
Стоит отметить, что даже с этой настройкой, если вы запускаете свой сервер SignalR за IIS 8.5+, который поддерживает веб-сокеты, тогда (если мы предполагаем, что IIS имеет настройки по умолчанию), IIS уничтожит все без исключения соединения веб-сокетов, которые неактивны в течение 2 минут, независимо от какое значение вы указываете на .serverTimeoutInMilliseconds. Поэтому для достижения оптимальных результатов в среде разработки также не забудьте настроить IIS на своих машинах разработки. - person XDS; 02.05.2019

То, что @MahmoudFarhat упомянул в другом ответе, верно. Но также взгляните на эту ссылку, а затем прочитайте мои комментарии ниже.

Если сигнал signalR отключился, попробуйте снова установить соединение. Соединение могло прерваться по ряду других причин, в том числе из-за того, что пользователь переключал сети. Например, если пользователь использует мобильный телефон и подключен к домашнему/офисному Wi-Fi, но выходит из него, который затем подключается к сотовому соединению для передачи данных.

Для повторного подключения вы можете использовать следующее (для меня работает как шарм):

// re-establish the connection if connection dropped
connection.onclose(() => setTimeout(startSignalRConnection(connection), 5000));

где startSignalRConnection:

const startSignalRConnection = connection => connection.start()
  .then(() => console.info('Websocket Connection Established'))
  .catch(err => console.error('SignalR Connection Error: ', err));

и связь есть

const connection = new HubConnectionBuilder()
  .withUrl(connectionHub, options)
  .withHubProtocol(protocol)
  .build();
person xeiton    schedule 11.10.2018
comment
Улучшение этого подхода состояло бы в том, чтобы использовать все большие и большие интервалы, если повторное соединение не удается снова и снова, а затем прекратить все попытки после того, как, скажем, 10 попыток. - person XDS; 02.05.2019
comment
где я должен назвать это соединение.onclose - person Raj; 08.01.2020
comment
@Raj, onclose() - это событие. Вы просто подписываетесь на него, и он сделает все за вас - person xeiton; 30.01.2020
comment
Обновление для путешественников во времени 2020 года: сейчас мы можем просто использовать .WithAutomaticReconnect() - person F.D.Castel; 27.04.2020