mbe*_*ley 112 asp.net rest web-applications signalr asp.net-web-api
我有一个使用ASP.NET开发的单页Web应用程序.我最近使用SignalR库将许多Web方法转换为基于推送的方法.这真的大大增加了页面,减少了页面上的大量服务器调用.
与此同时,我也一直在寻找RESTful ASP.NET WebAPI的一些服务器端方法,真正的美妙之处在于它允许在我开发的同时为外部应用程序创建API.核心应用程序(这对我正在做的事情很重要).
然而,在看了几篇文章和这 两个问题后,似乎推送和WebAPI方法似乎是两种完全不同的客户端 - 服务器通信范例.我敢肯定我可以创建各种方法,可以通过任何协议访问,但我不确定是否有这个陷阱或如果这被认为是草率 - 也许有一个更优雅的方式来实现我的目标对于.
在某种情况下,我希望RESTful WebAPI通过SignalR集线器广播事件......相反(SignalR需要访问WebAPI)似乎不太可能,但我认为仍然可能.
有没有人这样做过?有没有人对如何进行有任何建议或提示?这里最优雅的方式是什么?
dav*_*d.s 84
看看这篇博客文章中的视频.它解释了如何将WebAPI与SignalR结合使用.
本质上,Web API + SignalR集成包含在这个类中:
public abstract class ApiControllerWithHub<THub> : ApiController
where THub : IHub
{
Lazy<IHubContext> hub = new Lazy<IHubContext>(
() => GlobalHost.ConnectionManager.GetHubContext<THub>()
);
protected IHubContext Hub
{
get { return hub.Value; }
}
}
Run Code Online (Sandbox Code Playgroud)
就这样.:)
Fil*_*p W 16
SignalR实际上已经整合到WebAPI源vNext(4.1)中.
如果您不使用RTM构建,而是从Codeplex中获取构建,您会看到有一个System.Web.Http.SignalR
可以使用的新项目.它是在几天前用这个提交添加的 - http://aspnetwebstack.codeplex.com/SourceControl/changeset/7605afebb159
示例用法(如提交中所述):
public class ToDoListController : HubController<ToDoListHub>
{
private static List<string> _items = new List<string>();
public IEnumerable<string> Get()
{
return _items;
}
public void Post([FromBody]string item)
{
_items.Add(item);
// Call add on SignalR clients listening to the ToDoListHub
Clients.add(item);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您现在不想切换到vNext,您可以随时使用该代码进行参考.
这个实现与Brad Wilson在NDC奥斯陆展示的内容非常相似(更为精致,包括测试等) - http://vimeo.com/43603472