我正在用一个简单的博客发布者试用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调用,然后再调用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);
}
第三种解决方案:
我没有想到的另一种(可能更好)的方法。
第四个解决方案:
我在可怕地滥用应如何使用signalR。
提前致谢!
最佳答案
您应该使用最直接的方式来满足您的需求。也就是说,从SignalR集线器调用WebAPI操作,反之亦然,这不是一个好方法。 WebAPI操作和集线器方法为特定类型的通信提供了接口(interface)。然后,任何内部调用都应转到处理您的业务逻辑的特定类。您可以使用GlobalHost.ConnectionManager.GetHubContext<MyHub>();
在这些类中访问中心上下文。有关示例,请参见hub documentation。
只要您只是在谈论可以有效地序列化为JSON的字符串和其他数据,我根本就不明白为什么需要使用WebAPI。如果您需要在Hub方法中完成的工作(可能)是长时间运行的(例如DB调用),则可以通过返回Task
来使Hub方法异步,这样它就不会阻塞SignalR连接。
但是,如果您要上传二进制数据(图像等),则将其上传到WebAPI操作是有意义的。请注意,您不能直接调用集线器方法。而是(如上所述),您应该分解出将所有客户端更新为单独的共享类的代码,然后可以从操作中调用该共享类。
关于c# - 关于Web Apis的Signalr Hub约定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20435328/