web-dev-qa-db-ja.com

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

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

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

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

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

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

107
mbeasley

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

基本的に、Web API + SignalRの統合は、この class で構成されます。

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

それで全部です。 :)

83
david.s

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

15
Filip W

以下は、2つのテクノロジーの統合を示すビデオです http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 およびこちら統合用のNuGetパッケージがあります https://www.nuget.org/packages/Microsoft.AspNet.WebApi.SignalR/

2
NinjaCross