Bisakah saya menggabungkan SignalR dan RESTful API?

116

Saya memiliki aplikasi web satu halaman yang dikembangkan menggunakan ASP.NET. Saya baru-baru ini mengubah banyak metode web menjadi berbasis push, menggunakan pustaka SignalR . Ini benar-benar mempercepat halaman secara signifikan dan mengurangi banyak panggilan server dari halaman.

Pada saat yang sama, saya juga telah melihat RESTful ASP.NET WebAPI untuk beberapa metode sisi server, dengan keindahan nyata yang memungkinkan untuk membuat API untuk aplikasi eksternal pada saat yang sama saya mengembangkan aplikasi inti (yang penting untuk apa yang saya lakukan).

Tampaknya Namun, setelah melihat beberapa artikel dan ini dua pertanyaan, yang mendorong dan WebAPI metode tampak seperti dua paradigma yang sama sekali berbeda untuk komunikasi client-server. Saya yakin bahwa saya dapat membuat berbagai metode yang dapat diakses melalui salah satu protokol, tetapi saya tidak yakin apakah ada kendala untuk ini atau jika ini dianggap ceroboh - mungkin ada cara yang lebih elegan untuk mencapai apa yang saya tuju untuk.

Pasti ada situasi di mana saya ingin RESTful WebAPI menyiarkan acara melalui hub SignalR ... Kebalikannya (SignalR pernah perlu mengakses WebAPI) tampaknya kurang mungkin, tetapi saya kira masih memungkinkan.

Apakah ada yang melakukan ini? Adakah yang punya saran atau tip tentang cara melanjutkan? Apa cara termaju paling elegan di sini?

mbeasley.dll
sumber
4
Lihat video dari postingan blog ini . Ini menjelaskan dengan tepat bagaimana Anda dapat menggunakan WebAPI dengan SignalR.
david.
@ david.s Membaca video itu, terlihat sempurna. Posting sebagai jawabannya dan saya akan menandainya.
mbeasley

Jawaban:

85

Lihat video dari postingan blog ini . Ini menjelaskan dengan tepat bagaimana Anda dapat menggunakan WebAPI dengan SignalR.

Intinya, integrasi API Web + SignalR terdiri dari kelas ini :

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

Itu saja. :)

david.s
sumber
43
Untuk langsung menambahkan SignalR ke ASP.NET Web API, teruskan video ke waktu 33:35.
bytefire
Video tidak dimuat melalui HTTPS, jika Anda memiliki plugin browser untuk memaksa HTTPS, Anda mungkin perlu menonaktifkannya
JMK
14
@bytefire: sebenarnya, integrasi API Web + SignalR dimulai kira-kira. pada 55 menit.
Dennis
2
@ davids.s: Saya tahu, saya sedikit terlambat, tapi terima kasih untuk tautannya. Saya telah menambahkan kutipan untuk pembaca selanjutnya.
Dennis
1
Tidak ada IAppBuilder.MapSignalR ()?
Josh Sutterfield
18

SignalR sebenarnya sudah dimasukkan ke dalam sumber WebAPI vNext (4.1).

Jika Anda tidak menggunakan build RTM, tetapi mengambil build dari Codeplex, Anda akan melihat ada proyek baru di sana yang disebut System.Web.Http.SignalRyang dapat Anda manfaatkan. Itu ditambahkan beberapa hari yang lalu dengan komit ini - http://aspnetwebstack.codeplex.com/SourceControl/changeset/7605afebb159

Contoh penggunaan (seperti yang disebutkan dalam komit):

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

Jika Anda tidak ingin beralih ke vNext untuk saat ini, Anda selalu dapat menggunakan kode itu sebagai referensi.

Implementasi ini sangat mirip (sedikit lebih dipoles, termasuk tes, dll.) Dengan apa yang ditunjukkan Brad Wilson di NDC Oslo - http://vimeo.com/43603472

Filip W
sumber
4
Saya telah melakukan itu di server. Tetapi tidak dapat menghubungkan klien. Apakah Anda tahu cara menghubungkan klien .NET dengan server yang disebutkan di atas?
bytefire
3
Saya menggunakan API Web 5.2.3 dan SignalR 2.2.1 dan kelas ini tidak dapat ditemukan. Apakah ada yang tahu sejarahnya? Apakah itu ditarik sebelum RTM? Pada akhirnya, saya hanya menyalin definisi kelas david.s, tapi saya penasaran apa yang terjadi.
Colin
1
@ 40Alpha - Saya pikir kami akhirnya hanya memiliki metode statis di Hub yang menggunakan GlobalHost.ConnectionManager.GetHubContext () (atau yang setara dengan ASP.NET Core), dan memanggil metode statis tersebut dari Kontroler API.
Colin
3

Berikut adalah video yang menunjukkan integrasi dari dua teknologi http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 dan di sini ada paket NuGet untuk integrasi https://www.nuget.org/ paket / Microsoft.AspNet.WebApi.SignalR /

NinjaCross
sumber
2
Paket ini rusak sekarang, saat menggunakan Kontrak Kode dengan aplikasi API Web, karena memerlukan non-generik IHubConnectionContext, yang digantikan oleh IHubConnectionContext<T>. Jawaban yang diterima adalah cara untuk pergi.
Dennis
Meskipun ini secara teoritis dapat menjawab pertanyaan, akan lebih baik jika menyertakan bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi. Harap edit jawaban Anda untuk memperbaikinya, lalu tandai posting Anda untuk meminta penghapusan
Matt