在 c 中使用推送通知编写简单的聊天#

Writing simple chat by using push notification in c#

提问人:Wojciech Szabowicz 提问时间:11/16/2023 更新时间:11/16/2023 访问量:20

问:

我正在测试推送通知,并想通过在 .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 参数,并且找不到任何线索,为什么?

或者也许这是一种错误的方法?

C# 休息

评论


答: 暂无答案