【问题标题】:Signal R Hub Conventions in regards to Web Api's关于 Web API 的 Signalr Hub 约定
【发布时间】:2013-12-07 17:31:37
【问题描述】:

我正在用一个简单的博客海报尝试 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 的使用方式。

提前致谢!

【问题讨论】:

    标签: c# asp.net-mvc asp.net-web-api signalr signalr-hub


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2017-11-20
      相关资源
      最近更新 更多