C# 关于Web Api的信号R集线器约定';s
我正在用一张简单的博客海报试用signalR,我不确定在实现它时什么是最佳实践 第一个解决方案: 让客户机在服务器上调用post方法,该方法将依次向相关web api或其他上传数据的方法提供数据。我打算在这里使用已经打开的连接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.
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操作是有意义的。请注意,不能直接调用集线器方法;相反(正如我上面所说的),您应该考虑将所有客户端更新到一个单独的共享类的代码,然后可以从您的操作中调用该类