关于 Web API 的信号 R 集线器约定



我正在用一个简单的博客海报试用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方法;相反(正如我上面所说的),您应该考虑将所有客户端更新到一个单独的共享类的代码,然后您可以从操作中调用该类。

最新更新