Hem SignalR hem de bir RESTful API'yi dahil edebilir miyim?


116

ASP.NET kullanılarak geliştirilmiş tek sayfalık bir web uygulamam var. Yakın zamanda, SignalR kitaplığını kullanarak birçok web yöntemini push tabanlı olacak şekilde dönüştürdüm . Bu, sayfayı gerçekten önemli ölçüde hızlandırdı ve sayfadan sunucu çağrılarının çoğunu azalttı.

Aynı zamanda, bazı sunucu tarafı yöntemleri için RESTful ASP.NET WebAPI'ye de bakıyorum, gerçek güzelliği, harici uygulamalar için bir API oluşturmaya izin vermesi ve aynı zamanda çekirdek uygulama (yaptığım şey için önemli olacak).

Bununla birlikte, birkaç makaleye ve bu iki soruya baktıktan sonra , itme ve WebAPI yöntemlerinin istemci-sunucu iletişimi için tamamen farklı iki paradigma gibi göründüğü görülmektedir. Her iki protokolden de erişilebilecek çeşitli yöntemler oluşturabileceğime eminim, ancak bu konuda tuzaklar olup olmadığından veya bunun özensiz olarak değerlendirilip değerlendirilmediğinden emin değilim - belki de hedeflediğim şeyi elde etmenin daha zarif bir yolu vardır. için.

Kesinlikle RESTful WebAPI'nin bir SignalR hub aracılığıyla olayları yayınlamasını istediğim durumlar var ... Bunun tersi (SignalR'nin WebAPI'ye erişmeye ihtiyacı var) daha az olası görünüyor, ancak sanırım yine de mümkün.

Bunu kimse yaptı mı? Nasıl devam edileceğine dair herhangi bir tavsiye veya ipucu olan var mı? Burada ilerlemenin en zarif yolu ne olabilir?


4
Bu blog gönderisindeki videoya bir göz atın . SignalR ile WebAPI'yi tam olarak nasıl kullanabileceğinizi açıklar.
david.

@ david.s Bu videoda gezinirken mükemmel görünüyor. Cevap olarak gönder ve ben işaretleyeceğim.
mbeasley

Yanıtlar:


85

Bu blog gönderisindeki videoya bir göz atın . SignalR ile WebAPI'yi tam olarak nasıl kullanabileceğinizi açıklar.

Esasen, Web API + SignalR entegrasyonu şu sınıftan oluşur :

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

Bu kadar. :)


43
Doğrudan ASP.NET Web API'ye SignalR eklemek için videoyu 33:35 saatine iletin.
bytefire

Video HTTPS üzerinden yüklenmiyor, HTTPS'yi zorlamak için bir tarayıcı eklentiniz varsa, onu devre dışı bırakmanız gerekebilir
JMK

14
@bytefire: aslında, Web API + SignalR entegrasyonu yaklaşık olarak başlıyor. 55 dakikada
Dennis

2
@ davids.s: Biliyorum, biraz geç kaldım ama bağlantı için teşekkürler. Diğer okuyucular için bir alıntı ekledim.
Dennis

1
IAppBuilder.MapSignalR () yok mu?
Josh Sutterfield

18

SignalR aslında zaten WebAPI kaynağı vNext (4.1) ile birleştirilmiştir.

RTM yapısını kullanmazsanız, bunun yerine Codeplex'ten bir derleme alırsanız, orada System.Web.Http.SignalRkullanabileceğiniz yeni bir proje olduğunu görürsünüz . Bu işlemle birkaç gün önce eklendi - http://aspnetwebstack.codeplex.com/SourceControl/changeset/7605afebb159

Örnek kullanım (kaydetmede belirtildiği gibi):

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

Şimdilik vNext'e geçmek istemiyorsanız, referans olarak her zaman bu kodu kullanabilirsiniz.

Bu uygulama, Brad Wilson'ın NDC Oslo'da gösterdiği şeye çok benzer (biraz daha parlak, testler vb.) - http://vimeo.com/43603472


4
Bunu sunucuda yaptım. Ancak istemciye bağlanamaz. Bir .NET istemcisini yukarıda belirtilen sunucuya nasıl bağlayacağınızı biliyor musunuz?
bytefire

3
Web API 5.2.3 ve SignalR 2.2.1 kullanıyorum ve bu sınıf hiçbir yerde bulunamıyor. Tarihi bilen var mı? RTM'den önce mi çekildi? Sonunda, david'in sınıf tanımını kopyaladım, ama neler olduğunu merak ediyorum.
Colin

1
@ 40Alpha - Sanırım Hub'da GlobalHost.ConnectionManager.GetHubContext () (veya ASP.NET Core eşdeğeri) kullanan ve API Denetleyicisinden bu statik yöntemleri çağıran statik yöntemlere sahip olduk.
Colin

3

İşte iki teknolojinin entegrasyonunu gösteren bir video http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 ve burada entegrasyon için bir NuGet paketi var https://www.nuget.org/ paketler / Microsoft.AspNet.WebApi.SignalR /


2
Bu paket, Web API uygulaması ile Kod Sözleşmeleri kullanılırken artık bozulmuştur, çünkü genel olmayan gerektirir IHubConnectionContext, bunun yerine IHubConnectionContext<T>. Kabul edilen cevap, gitmenin bir yoludur.
Dennis

Bu teorik olarak soruya cevap görülebilir fakat tercih edildiğini burada cevabın temel parçalarını kapsadığı ve başvuru için bağlantı sağlar. Lütfen bunu düzeltmek için cevabınızı düzenleyin, ardından silmenin geri alınmasını istemek için yayınınızı işaretleyin
Mat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.