提问人:Wojciech Szabowicz 提问时间:11/16/2023 更新时间:11/16/2023 访问量:20
在 c 中使用推送通知编写简单的聊天#
Writing simple chat by using push notification in c#
问:
我正在测试推送通知,并想通过在 .net rest API 上使用创建简单的聊天来做一些简单的练习。在控制器中,首先我要为订阅的客户端创建并发包。
private static readonly ConcurrentBag<StreamWriter> Clients;
static ChatController()
{
Clients = new ConcurrentBag<StreamWriter>();
}
接下来,我需要将订阅者聚合到我创建的列表中的方法:
[HttpGet, ActionName("Subscribe")]
public HttpResponseMessage Subscribe()
{
void OnStreamAvailable(Stream stream, HttpContent content, TransportContext context)
{
var client = new StreamWriter(stream);
Clients.Add(client);
}
HttpResponseMessage response = new HttpResponseMessage
{
Content = new PushStreamContent(OnStreamAvailable, "text/event-stream"),
};
return response;
}
因此,这里的逻辑很简单,每次有人订阅推送流内容时,将该客户端添加到订阅列表中。
Also Post 消息方法:
[HttpPost, ActionName("Post")]
public async Task Post(Message message)
{
async Task ChatCallbackMsg(Message callbackMessage)
{
foreach (var client in Clients)
{
try
{
var data = $"data:{callbackMessage.Username}|{callbackMessage.Text}|{callbackMessage.Timestamp}\n\n";
await client.WriteAsync(data);
await client.FlushAsync();
await client.DisposeAsync();
}
catch (Exception)
{
Clients.TryTake(out _);
}
}
}
await ChatCallbackMsg(message);
}
也很简单,对于每个订阅的客户端,我都会推送消息作为通知。
我通过简单地钩接到浏览器 js 控制台中的 EventSource 对象来测试这一点
let sse = new EventSource('http://localhost:5284/api/Chat/Subscribe')
然后在 Swagger 中使用 post 方法。
现在的问题是,当有人连接时,PushStreamContent 确实执行了它的操作 OnStreamAvaiable 参数,并且找不到任何线索,为什么?
或者也许这是一种错误的方法?
答: 暂无答案
评论