我正在用一个简单的博客海报试用signalR,我不确定实现它的最佳实践是什么。
第一个解决方案:让客户端调用服务器上的post方法,后者将数据提供给相关的web api或其他上传数据的方法。我的意图是使用已经打开的连接。
public class BlogHub : Hub
{
public void Post(string text)
{
//Internal Webapi call / other method of DB Update.
Clients.All.BroadcastPost(text);
}
}
第二种解决方案:让客户端对web api进行ajax调用,然后web api调用post方法并将其广播回客户端。
public void PostPost(string text) //May have to call this method something different...
{
db.posts.add(new PostModel(text));
db.SaveChanges();
Post(string Text);
}
第三种解决方案:另一种(可能更好的)方法我还没想到。
第四种解决方案:我严重滥用信号R的使用方式。
提前感谢!
您应该使用最直接的方式来满足您的需求。也就是说,从SignalR集线器调用WebAPI操作,或者反之亦然,都不是一个好方法。WebAPI操作和Hub方法为特定类型的通信提供了接口。然后,任何内部调用都应该转到处理业务逻辑的特定类。您可以使用GlobalHost.ConnectionManager.GetHubContext<MyHub>();
访问这些类中的集线器上下文。有关示例,请参阅集线器文档。
只要您只谈论可以有效地序列化为JSON的字符串和其他数据,我就不明白为什么您需要涉及WebAPI。如果您需要在hub方法中进行的工作(可能)是长时间运行的(例如,DB调用),您可以通过返回Task
使hub方法异步,这样它就不会阻塞SignalR连接。
但是,如果您想要上传二进制数据(图像等),那么将其上传到WebAPI操作是有意义的。请注意,您不能直接调用hub方法;相反(正如我上面所说的),您应该考虑将所有客户端更新到一个单独的共享类的代码,然后您可以从操作中调用该类。