C# 关于Web Api的信号R集线器约定';s

C# 关于Web Api的信号R集线器约定';s,c#,asp.net-mvc,asp.net-web-api,signalr,signalr-hub,C#,Asp.net Mvc,Asp.net Web Api,Signalr,Signalr Hub,我正在用一张简单的博客海报试用signalR,我不确定在实现它时什么是最佳实践 第一个解决方案: 让客户机在服务器上调用post方法,该方法将依次向相关web api或其他上传数据的方法提供数据。我打算在这里使用已经打开的连接 public class BlogHub : Hub { public void Post(string text) { //Internal Webapi call / other method of DB Update.

我正在用一张简单的博客海报试用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);     
}
第三种解决方案: 另一种(可能更好)我没想到的方法

第四种解决办法: 我在滥用信号器的使用方法


提前谢谢

你应该使用最直接的方式来满足你的需求。也就是说,从SignalR hub调用WebAPI操作或从SignalR hub调用WebAPI操作都不是一个好方法。WebAPI操作和集线器方法为特定类型的通信提供接口。然后,任何内部调用都应该转到处理业务逻辑的特定类。您可以使用
GlobalHost.ConnectionManager.GetHubContext()访问这些类中的中心上下文有关示例,请参见

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

public class BlogHub : Hub
{
    public void Post(string text)
    {
        //Internal Webapi call / other method of DB Update.

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