SignalR ทำงานอย่างไรภายใน


160

ทุกคนสามารถแจ้งให้ฉันทราบว่า SignalR ทำงานภายในอย่างไรในระดับสูง?

ฉันเดาว่ามันกำลังล้างข้อมูลโดยใช้Response.Flushและที่ฝั่งไคลเอ็นต์มันกำลังส่งคำขอ Ajax ในบางช่วงเวลา ถูกต้องหรือไม่


13
@dfowler ได้ให้สัมภาษณ์กับ Scott Hansleman เมื่อเร็ว ๆ นี้นั่นคือhanselminutes.com/291/ข้อมูลที่มีประโยชน์มาก
จัด

1
บทความที่ดีเกี่ยวกับสัญญาณสถาปัตยกรรม R และวิธีการทำงานlostechies.com/erichexter/2012/11/05/... asp.net/signalr/overview/getting-started/...
Mahesh

ฉันรู้ว่ามันนานมาแล้ว แต่microsoftvirtualacademy.com/Content/ …
lordkain

1
ดูการนำเสนอนี้ที่ NDC 2013 จาก David Fowler และ Damian Edwards ที่เรียกว่า 'Under the cover with ASP.NET SignalR' ซึ่งพวกเขาสร้าง SignalR รุ่นสดบนเวที มันมีข้อมูลมาก มันคือ 2.0 ก่อน แต่มันไม่ควรสำคัญมาก vimeo.com/68383353
Johan B

คำตอบ:


241

ไม่ SignalR เป็นสิ่งที่เป็นนามธรรมผ่านการเชื่อมต่อ มันทำให้คุณมีสองรูปแบบการเขียนโปรแกรมผ่านการเชื่อมต่อนั้น (ฮับและการเชื่อมต่อแบบถาวร) SignalR มีแนวคิดของการขนส่งแต่ละการขนส่งตัดสินใจว่าจะส่ง / รับข้อมูลและเชื่อมต่อและตัดการเชื่อมต่ออย่างไร

SignalR มีการขนส่งในตัวไม่กี่:

  1. WebSockets
  2. เหตุการณ์ที่เซิร์ฟเวอร์ส่ง
  3. เฟรมตลอดกาล
  4. เลือกตั้งนาน

SignalR พยายามเลือกการเชื่อมต่อที่ "ดีที่สุด" ที่เซิร์ฟเวอร์และไคลเอนต์สนับสนุน (คุณสามารถบังคับให้มันใช้การส่งผ่านข้อมูลเฉพาะ)

นั่นคือระดับสูง หากคุณต้องการดูว่าการขนส่งแต่ละครั้งมีการใช้งานอย่างไรคุณสามารถดูซอร์สโค้ดได้

นอกจากนี้ยังมีรหัสลูกค้าสำหรับการขนส่งแต่ละครั้ง: https://github.com/SignalR/SignalR/tree/master/src/Microsoft.AspNet.SignalR.Client.JS

หากคุณกำลังถามเกี่ยวกับการทำงานของการขนส่งแบบสำรวจนาน:

ส่งคำขอ ajax ไปยังเซิร์ฟเวอร์ที่กำลังรอสัญญาณตอบกลับแบบอะซิงโครนัส เมื่อมีสัญญาณหรือการร้องขอหมดเวลาสัญญาณจะส่งคืนจากเซิร์ฟเวอร์และส่งการร้องขออื่นและกระบวนการดำเนินการต่อ (ฉันทิ้งรายละเอียดบางอย่างเกี่ยวกับวิธีที่ลูกค้าติดตามสิ่งที่เห็นดังนั้นจึงไม่พลาดข้อความ)

หวังว่าคำตอบส่วนใหญ่ของคำถามของคุณ


3
คุณสามารถบอกฉันได้ว่ามีกี่การเชื่อมต่อที่สามารถรองรับได้ในคราวเดียว
Farhad-Taran

1
การพิจารณาจำนวนการเชื่อมต่อที่ Signalr จะให้การสนับสนุนนั้นขึ้นอยู่กับขีด จำกัด การร้องขอของ IIS สามารถเพิ่มได้โดยใช้รายการกำหนดค่าหรือสคริปต์เชลล์ โดยปกติ Signalr จะแคช 1000 connectiosn ในหน่วยความจำ
Thanigainathan

1
ดังที่กล่าวไปแล้วขีด จำกัด การชุมนุมอยู่ที่ระดับเซิร์ฟเวอร์ Damnien Edwards (ผู้สร้างร่วมของ SignalR) ได้รับการเชื่อมต่อ 150,000 ครั้งจากเซิร์ฟเวอร์ 10GB เครื่องเดียว: twitter.com/DamianEdwards/status/486642486350061568
LDJ

คำตอบสำหรับคำถามนี้stackoverflow.com/q/40906789/3565879
Technacron

@davidfowl โปรดให้คำตอบสำหรับstackoverflow.com/questions/47504489//
Hitesh Thakor

5

@davidfowl ได้ตอบส่วนที่สำคัญแล้ว อย่างไรก็ตามเพื่อให้รายละเอียดเพิ่มเติมเกี่ยวกับความแตกต่างในพฤติกรรมของการขนส่งโดยเฉพาะระหว่าง WebSocket และการขนส่งอื่น ๆ ด้านล่างคือบางจุด

  • WebSocket เป็นการขนส่งเดียวที่สร้างการเชื่อมต่อแบบสองทางระหว่างไคลเอนต์และเซิร์ฟเวอร์อย่างแท้จริง อย่างไรก็ตาม WebSocket รองรับโดย IIS 8 หรือสูงกว่าเท่านั้นและ Internet Explorer, Google Chrome และ Mozilla Firefox รุ่นล่าสุด
  • ขณะที่ Server Sent Events, Forever Frame และ Long polling ทั้งสามติดตามการสื่อสารทางเดียวและได้รับการสนับสนุนโดยเบราว์เซอร์ส่วนใหญ่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.