aluckdog
根据GitHub上的aspnetcore/SignalR服务器端代码,看来调用错误确实是通过字符串值传递的。负责发送错误的方法定义如下:private async Task SendInvocationError(string invocationId, HubConnectionContext connection, string errorMessage){ if (string.IsNullOrEmpty(invocationId)) { return; } await connection.WriteAsync(CompletionMessage.WithError(invocationId, errorMessage));}以及一些关于如何调用它的示例:if (!await IsHubMethodAuthorized(scope.ServiceProvider, connection, descriptor, hubMethodInvocationMessage.Arguments, hub)){ Log.HubMethodNotAuthorized(_logger, hubMethodInvocationMessage.Target); await SendInvocationError(hubMethodInvocationMessage.InvocationId, connection, $"Failed to invoke '{hubMethodInvocationMessage.Target}' because user is unauthorized"); return;}var errorMessage = ErrorMessageHelper.BuildErrorMessage($"Failed to invoke '{bindingFailureMessage.Target}' due to an error on the server.", bindingFailureMessage.BindingFailure.SourceException, _enableDetailedErrors);return SendInvocationError(bindingFailureMessage.InvocationId, connection, errorMessage);有关错误的唯一信息是 的字符串参数errorMessage。另一方面,客户端 javascript 库源代码:HubConnection.prototype.connectionClosed = function (error) { this.logger.log(_ILogger__WEBPACK_IMPORTED_MODULE_2__["LogLevel"].Debug, "HubConnection.connectionClosed(" + error + ") called while in state " + this.connectionState + "."); // Triggering this.handshakeRejecter is insufficient because it could already be resolved without the continuation having run yet. this.stopDuringStartError = this.stopDuringStartError || error || new Error("The underlying connection was closed before the hub handshake could complete."); // If the handshake is in progress, start will be waiting for the handshake promise, so we complete it. // If it has already completed, this should just noop. if (this.handshakeResolver) { this.handshakeResolver(); } this.cancelCallbacksWithError(error || new Error("Invocation canceled due to the underlying connection being closed.")); ...};这表明这"Invocation canceled due to the underlying connection being closed."是服务器未提供任何信息时的默认错误消息。因此,我相信如果SignalR团队没有改变错误消息发送机制,你的string.includes做法是合理的。