【问题标题】:ASP.NET CORE 2.1 Server timeout while debugging调试时 ASP.NET CORE 2.1 服务器超时
【发布时间】:2018-04-13 11:45:53
【问题描述】:

'错误:服务器超时未收到来自 服务器。'。

我正在尝试调试一些服务器端代码,当我这样做时,客户端会在不到一分钟的时间内断开连接。

我只使用 SignalR 与客户端通信,还没有控制器。

是否有任何设置可以禁用超时或至少使其比现在更长?

我的launchSettings.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"
      }
    }
  }
}

【问题讨论】:

  • 哪个服务器,IIS Express + Kestrel?这是一个已知问题。尝试将启动配置文件切换为仅 kestrel。
  • @Tratcher 我编辑了帖子并添加了我的launchSettings.json。我认为它仅根据文档所说的内容启动 Kestrel:使用 dotnet run 启动应用程序时,将使用第一个带有 "commandName": "Project" 的配置文件。 commandName 的值指定要启动的 Web 服务器。 commandName 可以是以下之一: IIS Express;信息系统;项目(启动 Kestrel) 所以我猜“Api”配置文件将与 Kestrel 一起使用,对吧?
  • 有道理。再次读取该错误听起来像是来自 SignalR 客户端,而不是服务器。
  • @MahmoudFarahat this._hubConnection = new HubConnectionBuilder().withUrl('http://localhost:5000/match').build(); this._hubConnection.serverTimeoutInMilliseconds = 1000 * 1000; 我尝试增加 serverTimeoutInMilliseconds 但尚未测试,因为我现在正忙于其他事情。如果您尝试并且有效,请相应地回答我的帖子。
  • 是的,这对我有用,我现在可以毫无问题地调试了,非常感谢 ????

标签: asp.net-core asp.net-core-signalr


【解决方案1】:

感谢@Arhire Ionut

这里是增加Javascript客户端超时的方法

hubConnection.serverTimeoutInMilliseconds = 100000; // 100 second

更多细节在这里 => https://github.com/aspnet/Docs/issues/6885

【讨论】:

  • 值得注意的是,即使使用此调整,如果您在支持 websocket 的 IIS 8.5+ 之后运行 SignalR 服务器(如果我们假设 IIS 具有默认设置),IIS 将终止所有 websocket 连接无论您在 .serverTimeoutInMilliseconds 上指定什么值,它们都处于非活动状态 2 分钟。因此,为了在您的开发环境中获得最佳结果,还记得在您的开发机器中调整您的 IIS。
【解决方案2】:

@MahmoudFarhat 在另一个答案中提到的是正确的。 But also take a look at this link 然后在下面阅读我的 cmets。

如果 signalR 断开连接,您应该尝试重新建立连接。连接可能由于其他几个原因而断开,包括用户切换网络。例如,如果用户正在使用手机并连接到家庭/办公室 Wifi,但退出后又连接到蜂窝数据连接。

要重新连接,您可以使用以下内容(对我来说就像一个魅力):

// 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();

【讨论】:

  • 对这种方法的改进是在重新连接一次又一次失败时采用越来越长的间隔,然后在达到 10 次尝试后停止全部尝试。
  • 我应该在哪里调用这个connection.onclose
  • @Raj,onclose() 是一个事件。您只需订阅它,它会为您处理一切
  • 2020年时间旅行者更新:现在我们可以使用.WithAutomaticReconnect()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 2019-02-15
相关资源
最近更新 更多