آشنایی با SignalR

دراین مقاله توضیحی در مورد SignalR ، و برخی از راه حل های آن می پردازیم. یک کتابخانه برای توسعه دهندگان ASP.NET است که فرآیند ساده اضافه کردن زمان واقعی قابلیت های وب به برنامه های کاربردی است.

آشنایی با SignalR

SignalR چیست

ASP.NET SignalR یک کتابخانه برای توسعه دهندگان ASP.NET است که فرآیند ساده اضافه کردن زمان واقعی قابلیت های وب به برنامه های کاربردی است. زمان واقعی قابلیت های وب ،توانایی داشتن کد سرور،انتقال فوری محتوا به کاربران متصل به آن که در دسترس می باشند، به جای منتظر ماندن سرور برای درخواست اطلاعات جدید از سمت یک مشتری  .

SignalR می تواند برای اضافه کردن هر نوع "زمان واقعی" قابلیت های وب به برنامه Asp.Net مورد استفاده قرار بگیرد.به عنوان مثال  در حالی که چت است ، شما بسیاری کار بیشتر می توانیدانجام دهید. هر زمان یک کاربر تازه یک صفحه وب به اطلاعات جدید، یا صفحه را پیاده سازی های رای گیری طولانی برای بازیابی اطلاعات جدید، آن یک کاندید برای استفاده از SignalR است. مثالها عبارتند از داشبورد و برنامه های کاربردی نظارت، برنامه های کاربردی مشترک (از قبیل ویرایش همزمان از اسناد)، به روز رسانی پیشرفت شغلی، و فرم های زمان واقعی.

SignalR همچنین قادر می سازد به طور کامل انواع جدیدی از برنامه های کاربردی وب که نیاز به روز رسانی فرکانس بالا از سرور، به عنوان مثال، بازی زمان واقعی راقادر می سازد. برای مثال خوبی از این، بازی ShootR را ببینید.

 SignalR یک API ساده برای ایجاد تماس های سرور به مشتری از راه دور، روش (RPC) که تماس توابع جاوا اسکریپت در مرورگر های مشتری (و دیگر سیستم عامل سرویس گیرنده) از سمت سرور کد دات نت فراهم می کند SignalR . همچنین شامل API  برای مدیریت اتصال (به عنوان مثال، اتصال و قطع اتصال حوادث)، و اتصالات گروه بندی را شامل می شود.

SignalR دسته مدیریت ارتباط به طور خودکار است، و به شما اجازه پخش پیامهای به تمام مشتریان متصل به طور همزمان، مانند یک اتاق چت را می دهد. شما همچنین می توانید پیام ها به مشتریان خاص بفرستید. ارتباط بین کلاینت و سرور ماندگار است، بر خلاف یک اتصال HTTP کلاسیک، که برای هر ارتباطی  یاید دوباره برقرار گردد.

SignalR ازقابلیت  سرور فشار"پشتیبانی می کند که در آن کد می تواند به سرور کد مشتری در مرورگر با استفاده از تلفن از راه دور روش (RPC) تماس بگیرد.، به جای مدل درخواست پاسخ مشترک در امروز وب است.

برنامه های کاربردی SignalR می تواند به هزاران نفر از مشتریان با استفاده از خدمات اتوبوسرانی، SQL Server و یا Redis مقیاس شود .SignalR منبع باز، از طریق GitHub. قابل دسترسی است.

SignalR and WebSocket

SignalR از حمل و نقل جدید  WebSocket  جدید که در آن موجود است، و سقوط به حمل و نقل های قدیمی تر که در آن لازم است استفاده می شود. در حالی که شما قطعا می تواند درخواست خود را با استفاده از WebSocket به طور مستقیم  با استفاده SignalR ارسال کنید این بدان معنی است که بسیاری از قابلیت های اضافی شما نیاز به پیاده سازی در حال حاضر خواهد داشت که برای شما انجام شده است. مهمتر از همه، این بدان معنی است که شما می توانید درخواست خود را ، کد را با استفاده ازWebSocket بدون نیاز به ایجاد یک مسیر جداگانه کد برای مشتریان قدیمی ترداشته باشید.  SignalR همچنین سپرشما میشود ازنگرانی نیاز به به روز رسانی به WebSocket ، چون SignalR ادامه خواهد داد برای به روزرسانی برای حمایت از تغییرات اساسی در انتقال و ارائه درخواست خود برای یک رابط سازگار در سراسر نسخه ها .
در حالی که شما قطعا می تواند به تنهایی  با استفاده از WebSocket ایجاد یک راه حل ایجاد کنید ، SignalR  تمام قابلیت که شما احتیاج دارید برای خودتان بنویسید نظیر انتقالات سابق و دریافت برنامه تان برای بروزرسانی به پیاده سازی WebSocket را فراهم میکند.

Transports and fallbacks

SignalR انتزاعی بیش از برخی از انتقالات  که باید انجام شوند برای انجام کار زمان واقعی بین کلاینت و سرور.

یک اتصال SignalR شروع می شود به عنوان HTTP  و سپس به یک اتصال WebSocket ترویج  می گردد اگر در دسترس باشد. WebSocket حمل و نقل ایده آل برای SignalR است، چون کارآمد ترین استفاده از حافظه سرور که ان را کارامد می سازد، کمترین تاخیر و دارای ویژگی های اساسی (مانند ارتباطات دوطرفه کامل بین کلاینت و سرور)است، همچنین در شرایط دقیق تر : WebSocket نیاز به سرور با استفاده از ویندوز سرور 2012 یا ویندوز 8 و دات نت فریم ورک 4.5 است. اگر این نیاز برآورده نشود ، SignalR تلاش خواهد کرد  از سایر انتقالات برای ایجاد ارتباطات استفاده کند.

HTML 5 transports

این حمل و نقل به حمایت Html5  بستگی دارد اگر مرورگری که سرویس گیرنده  استفاده می کند استاندارد HTML 5  را پشتیبانی نکند، حمل و نقل های قدیمی تر استفاده می شود.

WebSocket (اگر هر دو سرور و مرورگر نشان دهند که می توانند WebSocket را حمایت کنند.)

WebSocket  تنها  اتصال درست ومداوم دو طرفه بین کلاینت و سروربرقرارشده باشد را انتقال میدهد. با این حال، WebSocket همچنین دارای الزامات سختگیرانه ترل است. WebSocket به طور کامل تنها در آخرین نسخه از مرورگر اینترنت اکسپلورر، گوگل کروم، موزیلا فایرفاکس پشتیبانی میشود ، و تنها دارای یک پیاده سازی جزئی در سایر مرورگرها مانند Opera و Safari است.

رویدادهای ارسالی از سرور که به عنوان Event Source شناخته شده است.اگر مرورگر رویدادهای ارسالی از سرور را پشتیبانی کند که اساسا همه مرورگرها به جز ie  پشتیبانی میکنند.

انتقالات دنباله دار

حمل و نقل های زیر از طریق دنباله دار مدل برنامه وب می باشد، که در آن یک مرورگر یا مشتری دیگر حفظ یک درخواست HTTP طولانی ، که سرور می تواند استفاده کند به انتقال داده به مشتری بدون اینکه مشتری درخواست خاص برای آن داده باشد.

 Forever Frame   (تنها برای اینترنت اکسپلورر ). Forever Frame یک IFrame پنهان ایجاد میکند که باعث  یک درخواست به نقطه پایانی بر روی سرور که کامل نیست میشود سپس سرور به طور مستمر اسکریپت به مشتری می فرستد که بلافاصله اجرا شده، ارائه یک اتصال بدون درنگ یک طرفه از سرور به مشتری برقرار میشود. اتصال از مشتری به سرور با استفاده از یک اتصال جداگانه از سرور به اتصال مشتری، و مانند یک درخواست HTML استاندارد، یک اتصال جدید برای هر قطعه از اطلاعات است که باید به آن ارسال شود ایجاد شده است.
   Ajax long polling.

  Ajax long polling.یک اتصال مداوم ایجاد نمی کند، اما به جای نظرسنجی سرور با یک درخواست که  باز می ماند تا زمانی که سرورپاسخ دهد، که در آن نقطه اتصال بسته می شود، و فورا یک ارتباط جدید درخواست میشود. این ممکن است باعث ایجاد تاخیر شود تا زمانی که ارتباط آزاد شود.

Transport selection process (فرآیند انتخاب انتقال)

فهرست زیر مراحلی است که SignalR استفاده می کند برای تصمیم گیری  که از کدام روش انتقال استفاده کند.

1-  در صورتی که مرورگر اینترنت اکسپلورر 8 یا قبل از آن است،  Long Polling استفاده می شود.

2-اگر JsonP پیکربندی شده باشد (پارامتر JsonP که مقدار آن true  تنظیم شود زمانی که ارتباط شروع میشود)
Long Polling استفاده می شود.

3- اگر یک ارتباط cross-domain ساخته شده باشد(اگر نقطه پایانی SignalR در دامنه مشابه به عنوان صفحه میزبان نباشد) دراینصورت WebSocket استفاده خواهد شد اگر شرایط زیر را دارا باشد:

1- کاربر CROS را پشتیبانی کند (Cross-Origin Resource Sharing)

2- کاربر WebSocket را پشتیبانی کند.

3- سرور WebSocket  را پشتیبانی کند.

 اگر هر یک از این معیارها را برآورده نشود، Long Polling استفاده خواهد شد.
4-    اگر JSONP پیکربندی نشده است و اتصال متقابل دامنه نیست، WebSocket استفاده خواهد شد اگر هر دو سرویس گیرنده و سرورآنرا پشتیبانی کنند .

5- اگر هر مشتری و یا سرور  WebSocket را پشتیبانی نمی کنند، رویدادهای ارسالی از سرور استفاده می شود که اگر آن  در دسترس باشد.

6-    اگر رویدادهای ارسالی از سرور در دسترس نیست، Forever Frame استفاده میشود.

7-اگر Forever Frame شکست خورد Long Polling استفاده میشود.


انتقال خصوصی

شما می توانید تعیین آنچه انتقال داده میشود از برنامه اتان با استفاده از فعال کردن ورود به هاب تان و بازکردن پنجره کنسول در مرورگرتان .

برای فعال سازی ورود به رویدادهای هاب تان در یک مرورگر ، دستور زیر را به برنامه کاربر اضافه کنید:

$.connection.hub.logging = true;

در ie با فشردن کلید f12 و رفتن به پنجره Console :

در کروم با فشردن کلید های Ctrl+Shift+J پنجره کنسول باز میشود.

با باز شدن پنجره کنسول و فعال شدن logging شما میتوانید که انتقال توسط  SignalR استفاده میشود را ببینید.

Specifying a transport

مذاکره حمل و نقل به یک مقدار مشخصی از زمان و منابع کلاینت / سرورطول می کشد. اگر قابلیت های مشتری شناخته شده باشد، و سپس حمل و نقل می تواند مشخص شود زمانی که اتصال مشتری آغاز شده رادرنظر گرفت. قطعه کد زیر نشان می دهد شروع یک اتصال با استفاده از انتقال Ajax Long Polling ، استفاده می شود اگر آن  شناخته شده باشد که کاربر  پروتکل دیگری را پشتیبانی نمی کند:
 

connection.start({ transport: 'longPolling' });


شما می توانید یک دستور FallBack را خصوصی سازی کنید اگر بخواهید که یک کاربر سعی در انتقال اطلاعات خاص داشته باشد. قطعه کد زیر بیانگر تلاش یک WebSocket است ودرصورت شکست به روش Long Polling ارسال میشود:

connection.start({ transport: ['webSockets','longPolling'] });


ثابت رشته برای تعیین حمل و نقل به شرح زیر تعریف می شود:

1- WebSockets

2-ForeverFrame

3-رویدادهای ارسالی از سرور

4-LongPolling

Connections and Hubs

SignalR API شامل دو مدل برای برقراری ارتباط بین کلاینت و سرور: ارتباطات مداوم و هاب.

اتصال نشان دهنده یک نقطه پایانی ساده برای ارسال پیام های تک گیرنده، گروه بندی و یا پخش. API اتصال مداوم (نشان داده شده در کد دات نت توسط کلاس PersistentConnection دسترسی مستقیم به توسعه دهندگان می دهد به پروتکل  ارتباطی  سطح پایین که در معرض SignalR قرار دارد . با استفاده از مدل ارتباطات اتصالات که توسعه دهندگان را آشنا می کند  که چگونه از Api های پایه اتصال نظیر WCF استفاده کنند.

یک هاب خط لوله تر در سطح بالا ساخته شده بر API اتصال که اجازه می دهد تا سرویس گیرنده و سرور فراخوانی متدها در تماس با یکدیگر به طور مستقیم . SignalR مدیریتارسال درسراسر ماشین  که  اجازه می دهد کاربران متد ها را در سرور فراخوانی کنند به راحتی به متد های local را  و بالعکس. با استفاده از مدل ارتباطی هاب  توسعه دهندگان را آشنا میسازد چگونه  که چگونه از راه دور Api ها را احضار کنند نظیر NET Remoting

همچنین  استفاده از هاب به شما اجازه انتقال پارامترهای strongly typed به متد ها و فعال سازی اتصال مدل.

نمودار معماری

نمودار زیر رابطه بین هاب، اتصالات مداوم، و فن آوری زمینه ای مورد استفاده برای حمل و نقل نشان می دهد.

How Hubs work (نحوه کارکرد هاب)

هنگامی که کد سمت سرور یک متد در سمت کاربر را فراخوانی می کنند یک بسته فرستاده میشود به انتقال فعال که شامل نام و پارامترهای متد از متدی که فراخوانی شده است. سپس درسمت  کاربرنام و پارامتری که از سمت سرور ارسال شده یکسان سازی میشوند.

اگر این یکسان سازی با موفقیت انجام شد متد در سمت کاربر توسط داده های deserialized اجرا خواهد شد.


فراخوانی متد میتواند از طریق ابزار Fiddler نظارت شود.تصویر زیر نماینگر فراخوانی متدی که از یک سرورSignalR  به مرورگر سمت کاربرفرستاده شده است در پنل log از Fiddler. متد ارسال شده از یک هاب MoveSHapeHub فراخوانی شده  و متد احضار شده UpdateSHape نام دارد.:

انتخاب مدل ارتباط

بیشتر برنامه ها از Hub Api استفاده می کنند. اتصال Api  در صورت  شرایط زیر مورد استفاده قرار میگیرد:

1-فرمت ارسال پیام واقعی باید مشخص شود

2-توسعه دهندگان ترجیح میدهند با مدل پیام رسانی و dispatching کارکنند به جای استفاده از احضار از راه دور مدل

3-نرم افزار موجود که ازیک مدل پیام رسانی استفاده می کند که کارایی SignalR را انتقال میدهد.