ฉันสามารถรวมทั้ง SignalR และ RESTful API ได้หรือไม่


116

ฉันมีเว็บแอปหน้าเดียวที่พัฒนาโดยใช้ ASP.NET ฉันเพิ่งแปลงวิธีการบนเว็บจำนวนมากให้เป็นแบบพุชโดยใช้ไลบรารีSignalR สิ่งนี้ทำให้หน้าเว็บเร็วขึ้นอย่างมากและลดการเรียกเซิร์ฟเวอร์จำนวนมากจากหน้าเว็บ

ในเวลาเดียวกันฉันยังได้ดู RESTful ASP.NET WebAPI สำหรับวิธีการฝั่งเซิร์ฟเวอร์ด้วยความสวยงามที่แท้จริงคืออนุญาตให้สร้าง API สำหรับแอปพลิเคชันภายนอกในเวลาเดียวกันกับที่ฉันพัฒนา แอปพลิเคชันหลัก (ซึ่งจะมีความสำคัญสำหรับสิ่งที่ฉันทำ)

ดูเหมือนว่าอย่างไรหลังจากที่กำลังมองหาที่หลายบทความและเหล่านี้ สองคำถามที่ผลักดันและ WebAPI วิธีดูเหมือนสองกระบวนทัศน์ที่แตกต่างกันอย่างสิ้นเชิงสำหรับการสื่อสารลูกค้าเซิร์ฟเวอร์ ฉันแน่ใจว่าฉันสามารถสร้างวิธีการต่างๆที่สามารถเข้าถึงได้ผ่านโปรโตคอลใดก็ได้ แต่ฉันไม่แน่ใจว่ามีข้อผิดพลาดเกิดขึ้นหรือไม่หรือถือว่าเป็นเรื่องที่เลอะเทอะ - อาจมีวิธีที่หรูหรากว่าในการบรรลุสิ่งที่ฉันตั้งเป้าไว้ สำหรับ.

มีหลายสถานการณ์ที่ฉันต้องการให้ RESTful WebAPI ออกอากาศเหตุการณ์ผ่านฮับ SignalR ... ตรงกันข้าม (SignalR เคยต้องการเข้าถึง WebAPI) ดูเหมือนจะมีโอกาสน้อยกว่า แต่ฉันคิดว่ายังคงเป็นไปได้

มีใครทำแบบนี้บ้าง? ใครมีคำแนะนำหรือเคล็ดลับในการดำเนินการ อะไรคือหนทางที่สง่างามที่สุดที่นี่?


4
ดูวิดีโอจากบล็อกโพสต์นี้ อธิบายอย่างชัดเจนว่าคุณสามารถใช้ WebAPI กับ SignalR ได้อย่างไร
david.s

@ david.s การดูวิดีโอนั้นมันดูสมบูรณ์แบบ โพสต์เป็นคำตอบแล้วฉันจะทำเครื่องหมาย
mbeasley

คำตอบ:


85

ดูวิดีโอจากบล็อกโพสต์นี้ อธิบายอย่างชัดเจนว่าคุณสามารถใช้ WebAPI กับ SignalR ได้อย่างไร

โดยพื้นฐานแล้วการรวม 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 น.
bytefire

วิดีโอไม่โหลดผ่าน HTTPS หากคุณมีปลั๊กอินเบราว์เซอร์เพื่อบังคับใช้ HTTPS คุณอาจต้องปิดการใช้งาน
JMK

14
@bytefire: จริงๆแล้วการรวม Web API + SignalR เริ่มต้นประมาณ เวลา 55 นาที
Dennis

2
@ davids.s: ฉันรู้ว่าฉันมาช้าไปหน่อย แต่ขอบคุณสำหรับลิงค์ ฉันได้เพิ่มข้อความที่ตัดตอนมาสำหรับผู้อ่านเพิ่มเติม
Dennis

1
ไม่มี IAppBuilder.MapSignalR ()?
Josh Sutterfield

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 ในตอนนี้คุณสามารถใช้รหัสนั้นเพื่ออ้างอิงได้ตลอดเวลา

การใช้งานนี้มีความคล้ายคลึงกันมาก (ขัดขึ้นเล็กน้อยรวมถึงการทดสอบ ฯลฯ ) กับสิ่งที่ Brad Wilson แสดงที่ NDC Oslo - http://vimeo.com/43603472


4
ฉันทำบนเซิร์ฟเวอร์แล้ว แต่ไม่สามารถเชื่อมต่อไคลเอนต์ คุณรู้วิธีเชื่อมต่อไคลเอนต์. NET กับเซิร์ฟเวอร์ที่กล่าวถึงข้างต้นหรือไม่?
bytefire

3
ฉันใช้ Web API 5.2.3 และ SignalR 2.2.1 และไม่พบคลาสนี้ มีใครทราบประวัติ มันดึงมาก่อน RTM หรือไม่? ในที่สุดฉันก็แค่คัดลอกนิยามคลาสของ david.s แต่ฉันอยากรู้ว่าเกิดอะไรขึ้น
Colin

1
@ 40Alpha - ฉันคิดว่าเราเพิ่งมีวิธีการแบบคงที่ใน Hub ที่ใช้ GlobalHost.ConnectionManager.GetHubContext () (หรือเทียบเท่า ASP.NET Core) และเรียกวิธีการแบบคงที่จาก API Controller
Colin

3

นี่คือวิดีโอที่แสดงการผสานรวมของสองเทคโนโลยี http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 และที่นี่มีแพ็คเกจ NuGet สำหรับการผสานรวม https://www.nuget.org/ แพคเกจ / Microsoft.AspNet.WebApi.SignalR /


2
แพคเกจนี้เสียตอนนี้เมื่อมีการใช้รหัสสัญญากับแอพลิเคชันเว็บ API เพราะต้องไม่ใช่ทั่วไปซึ่งถูกแทนที่ด้วยIHubConnectionContext IHubConnectionContext<T>คำตอบที่ได้รับการยอมรับคือหนทางที่จะไป
Dennis

ในขณะนี้อาจตอบคำถามในทางทฤษฎีได้ แต่ควรรวมส่วนสำคัญของคำตอบไว้ที่นี่และระบุลิงก์สำหรับการอ้างอิง โปรดแก้ไขคำตอบของคุณเพื่อแก้ไขแล้วตั้งค่าสถานะโพสต์ของคุณเพื่อขอให้ยกเลิกการลบ
Matt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.