关于Web Api的Signal R Hub约定

Sco*_*ths 5 c# asp.net-mvc signalr asp.net-web-api signalr-hub

我正在用一个简单的博客发布者试用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

第二种解决方案:让客户端对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);     
}
Run Code Online (Sandbox Code Playgroud)

第三种解决方案:我没想到过的另一种(可能更好)的方法。

第四种解决方案:我可怕地滥用应如何使用signalR。

提前致谢!

Lar*_*ner 4

您应该使用最直接的方式来满足您的要求。也就是说,从 SignalR 中心调用 WebAPI 操作(反之亦然)并不是一个好方法。WebAPI 操作和 Hub 方法为特定类型的通信提供接口。然后,任何内部调用都应该转到处理您的业务逻辑的特定类。您可以通过GlobalHost.ConnectionManager.GetHubContext<MyHub>();查看集线器文档获取示例来访问这些类中的集线器上下文。

只要您只讨论可以有效序列化为 JSON 的字符串和其他数据,我根本不明白您为什么需要涉及 WebAPI。如果您需要在 hub 方法中执行的工作(可能)是长时间运行的(例如数据库调用),您可以通过返回 a 使 hub 方法异步,Task这样它就不会阻止 SignalR 连接。

但是,如果您想上传二进制数据(图像等),则将其上传到 WebAPI 操作是有意义的。请注意,您不能直接调用 hub 方法;相反(正如我上面所说),您应该提取将所有客户端更新为单独的共享类的代码,然后您可以从您的操作中调用该共享类。