我希望能够控制 SignalR 中流的连接,但我不知道如何做到这一点。目前我的服务器端代码如下:
public ChannelReader<int> MyStream(int count, CancellationToken cancellationToken)
{
Channel<int> channel = Channel.CreateUnbounded<int>();
// ... Doing some stuff
return channel.Reader;
}
除此之外,我还使用通道对象进行写入。我的客户端代码如下:
const connection = new HubConnectionBuilder()
.withUrl(url, {
skipNegotiation: true,
transport: HttpTransportType.WebSockets,
})
.withAutomaticReconnect()
.build();
const stream = connection.stream('MyStream', 1000);
现在流的类型为
IStreamResult
,但它只有一个方法.subscribe()
。
我希望能够控制流是否处于活动状态。 Hub 连接具有方法 .on()
和 .off()
,可以控制它们来手动注册/取消注册处理程序。我想要 .stream()
方法有类似的东西。
我只希望能够在集线器保持其整体连接的同时连接和断开与该特定流的连接。这可能吗?或者我的处理方式是错误的?
要终止 TypeScript 中的 SignalR 流而不丢失连接,可以使用
cancelCallback
方法提供的 stream()
函数。这允许您控制流的活动,同时保持 SignalR 集线器连接处于活动状态。您需要存储对 cancelCallback
的引用,并在想要停止流时调用它。
以下是修改客户端 TypeScript 代码的方法:
cancelCallback
存储在变量中。cancelCallback
停止流,而无需断开与 SignalR 集线器的连接。const connection = new HubConnectionBuilder()
.withUrl(url, {
skipNegotiation: true,
transport: HttpTransportType.WebSockets,
})
.withAutomaticReconnect()
.build();
let cancelStream: () => void;
connection.start().then(() => {
const stream = connection.stream('MyStream', 1000,
() => {
console.log('Stream completed');
},
() => {
console.log('Stream cancelled');
});
stream.subscribe({
next: (item) => { console.log(item); },
complete: () => { console.log('Stream completed'); },
error: (err) => { console.error(err); },
});
// Store the cancel callback
cancelStream = stream.cancelCallback;
});
// Call this function to cancel the stream
function stopStream() {
if (cancelStream) {
cancelStream();
}
}
回顾:要在 TypeScript 中控制 SignalR 流而不关闭连接,请存储
cancelCallback
方法中的 stream()
并调用它来停止流。这种方法允许您管理流的生命周期,同时保持集线器连接处于活动状态。