我可以同时使用SignalR和RESTful API吗?


116

我有一个使用ASP.NET开发的单页Web应用程序。最近,我使用SignalR库将许多Web方法转换为基于推送的方法。这确实大大加快了页面速度,并减少了页面中的许多服务器调用。

同时,我也一直在研究一些服务器端方法的RESTful ASP.NET WebAPI,其真正的美在于,它允许在开发应用程序的同时为外部应用程序创建API。核心应用程序(这对我的工作很重要)。

然而,在看了几篇文章和 两个问题之后,push和WebAPI方法似乎是客户端-服务器通信的两个完全不同的范例。我敢肯定,我可以创建可以通过这两种协议访问的各种方法,但是我不确定是否存在陷阱或认为这很草率-也许有一种更优雅的方法可以实现我的目标对于。

当然,在某些情况下,我希望RESTful WebAPI通过SignalR集线器广播事件...相反(SignalR曾经需要访问WebAPI)似乎不太可能,但我想仍然可能。

有人这样做吗?有人对如何进行有任何建议或提示吗?在这里,最优雅的前进方向是什么?


4
看一下这篇博客文章中的视频。它确切说明了如何将WebAPI与SignalR一起使用。
david.s 2012年

@ david.s浏览该vid,看起来很完美。将其发布为答案,我会对其进行标记。
mbeasley 2012年

Answers:


85

看一下这篇博客文章中的视频。它确切说明了如何将WebAPI与SignalR一起使用。

从本质上讲,网络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; }
    }
}

就这样。:)


43
要直接将SignalR添加到ASP.NET Web API,请将视频转发到时间33:35。
2013年

该视频无法通过HTTPS加载,如果您具有用于强制HTTPS的浏览器插件,则可能需要将其禁用
JMK 2014年

14
@bytefire:实际上,Web API + SignalR集成大约开始。在55分钟
丹尼斯

2
@ davids.s:我知道,我来晚了一点,但是感谢您的链接。我为更多读者添加了节选。
丹尼斯

1
没有IAppBuilder.MapSignalR()吗?
乔什·萨特菲尔德

18

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);
    }
}

如果您暂时不想切换到vNext,则始终可以使用该代码作为参考。

此实现与Brad Wilson在NDC奥斯陆(NDC Oslo)上展示的内容非常相似(更加完善,包括测试等)-http: //vimeo.com/43603472


4
我已经在服务器上完成了。但是无法连接客户端。您知道如何将.NET客户端与上述服务器连接吗?
2013年

3
我正在使用Web API 5.2.3和SignalR 2.2.1,并且在任何地方都找不到此类。有人知道历史吗?在RTM之前就被取消了吗?最终,我只是复制了david.s的类定义,但是我很好奇发生了什么。
科林

1
@ 40Alpha-我认为我们最终在使用GlobalHost.ConnectionManager.GetHubContext()(或ASP.NET Core等效项)的Hub中只有静态方法,并从API Controller调用了这些静态方法。
科林

3

这是一个视频,显示了两种技术 的集成,网址http://channel9.msdn.com/Events/TechDays/Belgium-2013/25,这里有一个用于集成的NuGet包 https://www.nuget.org/包/Microsoft.AspNet.WebApi.SignalR/


2
在将Code Contracts与Web API应用程序一起使用时,此软件包现在已损坏,因为它需要非通用IHubConnectionContext,已由代替IHubConnectionContext<T>。接受的答案是一种解决方法。
丹尼斯

虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。请编辑你的答案来纠正这一点,那么你的旗岗位要求未删除部分
马特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.