SignalRとRESTful APIの両方を組み込むことはできますか?


116

ASP.NETを使用して開発された単一ページのWebアプリがあります。最近、SignalRライブラリを使用して、多くのWebメソッドをプッシュベースに変換しました。これにより、ページが大幅に高速化され、ページからのサーバー呼び出しの多くが削減されました。

同時に、サーバー側のメソッドの一部についてRESTful ASP.NET WebAPIも検討してきました。本当の美しさは、外部アプリケーション用のAPIを開発と同時に作成できることです。コアアプリケーション(これは私がやっていることにとって重要です)。

ただし、いくつかの記事とこれら 2つの質問を見てみると、pushメソッドとWebAPIメソッドは、クライアント/サーバー通信の2つのまったく異なるパラダイムのように見えます。私はどちらのプロトコルでもアクセスできるさまざまなメソッドを作成できると確信していますが、これに落とし穴があるのか​​、これがずさんだと見なされているのかは不明です-おそらく私が目指していることを達成するためのよりエレガントな方法があるでしょうために。

RESTful WebAPIがSignalRハブを介してイベントをブロードキャストする必要がある状況は確かにあります...反対(SignalRはWebAPIにアクセスする必要がある)とは思われませんが、それでも可能だと思います。

誰かこれをやったことがありますか?誰かがどのように進めるかについてアドバイスやヒントを持っていますか?ここで最もエレガントな方法は何でしょうか?


4
このブログ投稿のビデオをご覧ください。SignalRでWebAPIを使用する方法を正確に説明します。
david.s 2012

@ david.sそのvidをざっと見て、完璧に見えます。回答として投稿してください。マークを付けます。
mbeasley 2012

回答:


85

このブログ投稿のビデオをご覧ください。SignalRでWebAPIを使用する方法を正確に説明します。

基本的に、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; }
    }
}

それで全部です。:)


43
SignalRをASP.NET Web APIに直接追加するには、ビデオを時間33:35に転送します。
バイトファイヤー2013

ビデオがHTTPS経由で読み込まれない、HTTPSを強制するブラウザープラグインがある場合、それを無効にする必要があるかもしれません
JMK

14
@bytefire:実際には、Web API + SignalRの統合はおよそ始まります。55分
デニス

2
@ davids.s:少し遅れましたが、リンクに感謝します。さらに読者のために抜粋を追加しました。
デニス

1
IAppBuilder.MapSignalR()はありませんか?
Josh Sutterfield、2016

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に切り替えたくない場合は、いつでもそのコードを参照として使用できます。

この実装は、ブラッドウィルソンがNDCオスロで示したもの(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の同等の機能)を使用するハブに静的メソッドがあり、それらの静的メソッドをAPIコントローラーから呼び出しただけだと思います。
コリン

3

これは2つのテクノロジーの統合を示すビデオです http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 そして、統合のためのNuGetパッケージがあり ますhttps://www.nuget.org/ packages / Microsoft.AspNet.WebApi.SignalR /


2
このパッケージは、Web APIアプリケーションでコードコントラクトを使用しているときに壊れIHubConnectionContextていIHubConnectionContext<T>ます。受け入れられた答えは行く方法です。
デニス

これにより理論的には質問に答えることができますが、ここに答えの本質的な部分を含め、参照用のリンクを提供することが望ましいでしょう。回答を編集してこれを修正し、投稿にフラグを付けて削除の
Matt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.