Tôi có thể kết hợp cả SignalR và API RESTful không?


116

Tôi có một ứng dụng web duy nhất được phát triển bằng ASP.NET. Gần đây tôi đã chuyển đổi nhiều phương thức web thành dựa trên push, sử dụng thư viện SignalR . Điều này thực sự đã tăng tốc trang đáng kể và giảm rất nhiều lệnh gọi máy chủ từ trang.

Đồng thời, tôi cũng đang xem xét RESTful ASP.NET WebAPI cho một số phương thức phía máy chủ, với vẻ đẹp thực sự là nó cho phép tạo một API cho các ứng dụng bên ngoài cùng lúc mà tôi phát triển ứng dụng cốt lõi (sẽ quan trọng đối với những gì tôi đang làm).

Dường Tuy nhiên, sau khi xem xét một số điều và những hai câu hỏi, rằng đẩy và WebAPI phương pháp có vẻ như hai mô hình hoàn toàn khác nhau để giao tiếp client-server. Tôi chắc chắn rằng tôi có thể tạo ra nhiều phương thức khác nhau có thể được truy cập thông qua một trong hai giao thức, nhưng tôi không chắc liệu có những cạm bẫy nào đối với điều này hoặc nếu điều này được coi là cẩu thả - có thể có một cách thanh lịch hơn để đạt được những gì tôi đang hướng tới cho.

Chắc chắn có những tình huống mà tôi muốn RESTful WebAPI phát các sự kiện thông qua một trung tâm SignalR ... Điều ngược lại (SignalR từng cần truy cập WebAPI) có vẻ ít xảy ra hơn, nhưng tôi cho rằng vẫn có thể.

Có ai đã làm điều này? Có ai có bất kỳ lời khuyên hoặc lời khuyên về cách tiến hành? Cách thanh lịch nhất ở đây sẽ là gì?


4
Hãy xem video từ bài đăng trên blog này . Nó giải thích chính xác cách bạn có thể sử dụng WebAPI với SignalR.
david.s

@ david.s Đọc lướt qua vid đó, nó có vẻ hoàn hảo. Đăng nó như câu trả lời và tôi sẽ đánh dấu nó.
mbeasley

Câu trả lời:


85

Hãy xem video từ bài đăng trên blog này . Nó giải thích chính xác cách bạn có thể sử dụng WebAPI với SignalR.

Về cơ bản, tích hợp Web API + SignalR bao gồm trong lớp này :

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

Đó là tất cả. :)


43
Để bắt đầu ngay việc thêm SignalR vào ASP.NET Web API, hãy chuyển tiếp video tới thời gian 33:35.
bytefire,

Video không tải qua HTTPS, nếu bạn có plugin trình duyệt để buộc HTTPS, bạn có thể cần phải tắt nó
JMK

14
@bytefire: trên thực tế, tích hợp Web API + SignalR bắt đầu khoảng. ở 55 phút.
Dennis

2
@ davids.s: Tôi biết, tôi hơi muộn, nhưng cảm ơn vì liên kết. Tôi đã thêm một đoạn trích cho người đọc thêm.
Dennis

1
Không có IAppBuilder.MapSignalR ()?
Josh Sutterfield

18

SignalR thực sự đã được tích hợp vào vNext nguồn WebAPI (4.1).

Nếu bạn không sử dụng bản dựng RTM mà thay vào đó lấy một bản dựng từ Codeplex, bạn sẽ thấy ở đó có một dự án mới được gọi là dự án System.Web.Http.SignalRmà bạn có thể sử dụng. Nó đã được thêm một vài ngày trước với cam kết này - http://aspnetwebstack.codeplex.com/SourceControl/changeset/7605afebb159

Cách sử dụng mẫu (như đã đề cập trong cam kết):

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

Nếu bạn không muốn chuyển sang vNext ngay bây giờ, bạn luôn có thể sử dụng mã đó để tham khảo.

Cách triển khai này rất giống (bóng bẩy hơn một chút, bao gồm các bài kiểm tra, v.v.) với những gì Brad Wilson đã trình bày tại NDC Oslo - http://vimeo.com/43603472


4
Tôi đã làm điều đó trên máy chủ. Nhưng không thể kết nối máy khách. Bạn có biết cách kết nối máy khách .NET với máy chủ được đề cập ở trên không?
bytefire,

3
Tôi đang sử dụng Web API 5.2.3 và SignalR 2.2.1 và không tìm thấy lớp này. Có ai biết lịch sử không? Nó có bị giật trước khi RTM không? Cuối cùng, tôi chỉ sao chép định nghĩa lớp của david.s, nhưng tôi tò mò chuyện gì đang xảy ra.
Colin

1
@ 40Alpha - Tôi nghĩ rằng chúng ta đã kết thúc chỉ có các phương thức tĩnh trong Trung tâm sử dụng GlobalHost.ConnectionManager.GetHubContext () (hoặc ASP.NET Core tương đương) và gọi các phương thức tĩnh đó từ Bộ điều khiển API.
Colin

3

Đây là video cho thấy sự tích hợp của hai công nghệ http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 và đây là gói NuGet để tích hợp https://www.nuget.org/ gói / Microsoft.AspNet.WebApi.SignalR /


2
Gói này hiện đã bị hỏng, khi sử dụng Hợp đồng mã với ứng dụng API Web, vì nó yêu cầu không chung chung IHubConnectionContext, đã được thay thế bằng IHubConnectionContext<T>. Câu trả lời được chấp nhận là một con đường để đi.
Dennis

Mặc dù điều này về mặt lý thuyết có thể trả lời câu hỏi, nhưng tốt hơn hết bạn nên đưa các phần thiết yếu của câu trả lời vào đây và cung cấp liên kết để tham khảo. Hãy chỉnh sửa câu trả lời của bạn sửa lỗi này, sau đó cờ bài viết của bạn để yêu cầu bỏ xóa
Matt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.