SignalR 和 React - 调用因底层连接关闭而取消
SignalR and React - Invocation canceled due to the underlying connection being closed
晚上好。
我正在使用 SignalR(5.0.1,我还尝试了早期版本 3.0.0)和 dotnet core 3.1 构建聊天组件。
任何一个用户发表的评论都可以发送给所有连接的客户端,所有连接的客户端都可以看到评论。但是,发送评论的客户端将断开连接,并捕获错误 addComment() in the mobx store
.
一个客户端在发送评论后会失去连接(发送者和其他客户端可以从ChatHub 获得处理过的评论)。我不知道为什么服务器决定断开连接并引发错误。我
错误:
[2021-01-10T22:38:14.314Z] Information: Connection disconnected.
adventureStore.ts:73 Error: Invocation canceled due to the underlying connection being closed.
at HubConnection.connectionClosed (HubConnection.ts:654)
at HttpConnection.HubConnection.connection.onclose (HubConnection.ts:103)
at HttpConnection.stopConnection (HttpConnection.ts:488)
at WebSocketTransport.transport.onclose (HttpConnection.ts:410)
at WebSocketTransport.close (WebSocketTransport.ts:135)
at WebSocket.webSocket.onclose (WebSocketTransport.ts:97)
代码如下:
启动:
public class Startup
{
// only showing the codes related to problem
services.AddSignalR();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(opt =>
{
opt.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = key,
ValidateAudience = false,
ValidateIssuer = false
};
opt.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) &&
(path.StartsWithSegments("/chat")))
{
context.Token = accessToken;
}
return Task.CompletedTask;
}
};
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMiddleware<ErrorHandlingMiddleware>();
if (env.IsDevelopment())
{
// app.UseDeveloperExceptionPage();
}
// app.UseHttpsRedirection();
app.UseRouting();
app.UseCors("CorsPolicy");
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<ChatHub>("/chat");
});
}
}
ChatHub.cs:
public class ChatHub : Hub
{
private readonly IMediator _mediator;
public ChatHub(IMediator mediator)
{
_mediator = mediator;
}
public async Task SendComment(Create.Command command)
{
var username = Context.User?.Claims?.FirstOrDefault(x => x.Type ==
ClaimTypes.NameIdentifier)?.Value;
command.Username = username;
var comment = await _mediator.Send(command);
// clients can successfully receive the comment and load it to their mobx store
await Clients.All.SendAsync("ReceiveComment", comment);
}
}
建立连接的mobx存储:
@observable comments: IComment[] | null = null;
@observable.ref hubConnection: HubConnection | null = null;
@action createHubConnection = () => {
this.hubConnection = new HubConnectionBuilder()
.withUrl("http://localhost:5000/chat", {
accessTokenFactory: () => this.rootStore.commonStore.token!,
})
.configureLogging(LogLevel.Information)
// i have to do this for now. Need to fix that disconnecting right
// after Clients.All.SendAsync("ReceiveComment", comment); in ChatHub.cs
// .withAutomaticReconnect([0, 0, 10000])
.build();
this.hubConnection
.start()
.then(() => console.log(this.hubConnection!.state))
.catch((error) => console.log("Error establishing connection: ", error));
this.hubConnection.on("ReceiveComment", (comment) => {
runInAction(() => {
if (this.comments == null) {
this.comments = new Array<IComment>();
}
this.comments.push(comment);
});
});
};
@action stopHubConnection = () => {
this.hubConnection!.stop();
};
@action addComment = async (values: any) => {
try {
await this.hubConnection!.invoke("SendComment", values);
} catch (error) {
console.log(error);
}
};
我有一个 Angular 客户端在连接到 Asp.net Core 3.1 中的 SignalR Hub 时面临同样的问题。应用的NuGet包是“Microsoft.AspNetCore.SignalR.Core”版本1.1.0。将 Asp.net Web API 门户升级到 .Net 5.0 后。问题已解决。
我遇到过同样的问题。我使用 System.Text.Json 作为默认的 json 序列化器。
为了解决这个问题,我将“Microsoft.AspNetCore.SignalR.Protocols.Json”nuget 升级到有效版本。
谁在使用 nginx 作为反向代理,请更新您的 nginx.config:
microsoft docs
这些步骤帮助我解决了同样的问题。
晚上好。 我正在使用 SignalR(5.0.1,我还尝试了早期版本 3.0.0)和 dotnet core 3.1 构建聊天组件。
任何一个用户发表的评论都可以发送给所有连接的客户端,所有连接的客户端都可以看到评论。但是,发送评论的客户端将断开连接,并捕获错误 addComment() in the mobx store
.
一个客户端在发送评论后会失去连接(发送者和其他客户端可以从ChatHub 获得处理过的评论)。我不知道为什么服务器决定断开连接并引发错误。我
错误:
[2021-01-10T22:38:14.314Z] Information: Connection disconnected.
adventureStore.ts:73 Error: Invocation canceled due to the underlying connection being closed.
at HubConnection.connectionClosed (HubConnection.ts:654)
at HttpConnection.HubConnection.connection.onclose (HubConnection.ts:103)
at HttpConnection.stopConnection (HttpConnection.ts:488)
at WebSocketTransport.transport.onclose (HttpConnection.ts:410)
at WebSocketTransport.close (WebSocketTransport.ts:135)
at WebSocket.webSocket.onclose (WebSocketTransport.ts:97)
代码如下:
启动:
public class Startup
{
// only showing the codes related to problem
services.AddSignalR();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(opt =>
{
opt.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = key,
ValidateAudience = false,
ValidateIssuer = false
};
opt.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) &&
(path.StartsWithSegments("/chat")))
{
context.Token = accessToken;
}
return Task.CompletedTask;
}
};
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMiddleware<ErrorHandlingMiddleware>();
if (env.IsDevelopment())
{
// app.UseDeveloperExceptionPage();
}
// app.UseHttpsRedirection();
app.UseRouting();
app.UseCors("CorsPolicy");
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<ChatHub>("/chat");
});
}
}
ChatHub.cs:
public class ChatHub : Hub
{
private readonly IMediator _mediator;
public ChatHub(IMediator mediator)
{
_mediator = mediator;
}
public async Task SendComment(Create.Command command)
{
var username = Context.User?.Claims?.FirstOrDefault(x => x.Type ==
ClaimTypes.NameIdentifier)?.Value;
command.Username = username;
var comment = await _mediator.Send(command);
// clients can successfully receive the comment and load it to their mobx store
await Clients.All.SendAsync("ReceiveComment", comment);
}
}
建立连接的mobx存储:
@observable comments: IComment[] | null = null;
@observable.ref hubConnection: HubConnection | null = null;
@action createHubConnection = () => {
this.hubConnection = new HubConnectionBuilder()
.withUrl("http://localhost:5000/chat", {
accessTokenFactory: () => this.rootStore.commonStore.token!,
})
.configureLogging(LogLevel.Information)
// i have to do this for now. Need to fix that disconnecting right
// after Clients.All.SendAsync("ReceiveComment", comment); in ChatHub.cs
// .withAutomaticReconnect([0, 0, 10000])
.build();
this.hubConnection
.start()
.then(() => console.log(this.hubConnection!.state))
.catch((error) => console.log("Error establishing connection: ", error));
this.hubConnection.on("ReceiveComment", (comment) => {
runInAction(() => {
if (this.comments == null) {
this.comments = new Array<IComment>();
}
this.comments.push(comment);
});
});
};
@action stopHubConnection = () => {
this.hubConnection!.stop();
};
@action addComment = async (values: any) => {
try {
await this.hubConnection!.invoke("SendComment", values);
} catch (error) {
console.log(error);
}
};
我有一个 Angular 客户端在连接到 Asp.net Core 3.1 中的 SignalR Hub 时面临同样的问题。应用的NuGet包是“Microsoft.AspNetCore.SignalR.Core”版本1.1.0。将 Asp.net Web API 门户升级到 .Net 5.0 后。问题已解决。
我遇到过同样的问题。我使用 System.Text.Json 作为默认的 json 序列化器。 为了解决这个问题,我将“Microsoft.AspNetCore.SignalR.Protocols.Json”nuget 升级到有效版本。
谁在使用 nginx 作为反向代理,请更新您的 nginx.config: microsoft docs
这些步骤帮助我解决了同样的问题。