【发布时间】:2015-08-11 20:42:17
【问题描述】:
目标:通过在数据库中存储新消息(发布到 Web API)并将其推送到单个侦听客户端 (SignalR) 来促进 2 个用户之间的聊天。
这是我的担忧:
- 除了Command and Query Responsibility Segregation (CQRS) Pattern 和Event Sourcing Pattern 之外,我找不到任何解决此问题的设计模式。这两者似乎都专注于复杂的实时应用程序。我的应用程序有很多传统的 REST 功能,但目前唯一的实时组件是聊天,因此似乎没有必要使用其中一种模式。
- 是否有更简单的方法将基于 REST 的网站 (Web API) 与实时组件 (SignalR) 集成?
- 我现在所做的感觉就像是在混合两种完全不同的东西。
我想试试:
- 使用 events 将我的 POST 处理程序耦合到我的推送处理程序 - 虽然我不确定这对我有帮助,因为我不希望我的应用程序的“发送消息”部分从“接收”部分演变成一部分.
- 将我所有的推送逻辑转移到由消息代理处理的作业中 - 这似乎也没有必要,但会产生更好的分离。根据answer,我的理解是 SignalR 使用内存中的消息代理,因此广播不会等待接收消息,因此除非我真的需要扩展,否则不需要外部消息代理。李>
也许我的应用程序太简单了,需要更好的设计?
这是我目前所拥有的:
public class chatPush
{
public chatPush(){}
public push(string msg)
{
try{
string jsonMsg = JsonConvert.SerializeObject(msg);
await Clients.User(userId).send(jsonMsg);
}
catch
{
string errorMsg = //error with msg
await Clients.User(userId).send(errorMsg);
}
}
}
async Task<IHttpActionResult> PostMessage(Message msg)
db.Messages.Add(msg);
try
{
await db.SaveChangesAsync();
}
catch
{
//return error in JSON
}
//if update succeeded push it out
_chatPush.push(jsonMsg);
return //Success or Error code
【问题讨论】:
标签: c# asp.net-web-api websocket signalr asp.net-web-api2