مفاهیم پایه ASP.NET SignalR (بخش اول)
Loading...
ASP.NET SignalR

در این مقاله، ما مفاهیم بسیار مقدماتی ASP.NET SignalR را که اخیرا یاد گرفته ایم معرفی کرده و یک دموی بسیار ساده با استفاده از PersistentConnection به صورت گام به گام نشان می دهیم. توجه داشته باشید که فولدر packages را از دموی پیوست شده به مقاله حذف کردیم، چرا که حجم آن برای آپلود بسیار بالاست. شما می توانید Microsoft.AspNet.SignalR را به صورت محلی از طریق NuGet واکشی نمایید. حالا از یک سری سوالات ابتدایی شروع می کنیم.

ASP.NET SignalR چه کارهایی می تواند انجام دهد؟

  • سرور داده ها را در اتصال HTTP به کلاینت push می کند.
  • RPC سرور به کلاینت در اتصال HTTP
  • از طریق SQL Server، Redis یا Service Bus مقیاس بندی می شود.

SignalR از چه تکنولوژی هایی برای انتقال داده استفاده می کند؟

  • استفاده از WebSocket اگر در دسترس باشد.
  • در غیر این صورت، استفاده از تکنولوژی های دیگر مانند long polling

چه نوع داده هایی را SignslR برای انتقال پشتیبانی می کند؟

  • متن JSON غیر فشرده یا plain text
  • اگر بخواهیم JSON فشرده یا BSON یا داده های باینری خود را انتقال دهیم، باید داده ها را رمزنگاری و سپس رمزگشایی نماییم (به عنوان مثال با استفاده از Base64) یا IJsonSerializer را به وسیله منطق خود در سمت سرور پیاده سازی نماییم و همان منطق را سمت کلاینت هم پیاده کنیم. توجه داشته باشید که TextReader و TextWriter درون SignalR استفاده می شوند. به این معنی است که ما به هرحال باید داده ها را قبل از انتقال به متن تبدیل کنیم.

نسخه پایدار فعلی ۱.۱.۳ ورژن ۲.۰ بتا است. تحت لیسانس Apache 2.0 است. وب سایت رسمی آن http://signalr.net می باشد. مستندات آن را می توانید در اینجا بیابید.

پکیج ها

همه پکیج های توسعه SignalR از طریق NuGet قابل واکشی هستند. به طور معمول، لازم است ما Microsoft.AspNet.SignalR (package ID) که شامل اغلب کامپوننت های موردنیاز ماست را واکشی نماییم. این کامپوننت ها عبارتند از:

  • Microsoft.AspNet.SignalR.Core: کامپوننت های سمت سروری که برای ساخت نقاط نهایی SignalR استفاده می شود.
  • Microsoft.AspNet.SignalR.Owin: هاست OWIN برای SignalR
  • Microsoft.AspNet.SignalR.SystemWeb: برای میزبانی SignalR در ASP.NET (از طریق هاست OWIN ASP.NET) استفاده می شود.
  • Microsoft.AspNet.SignalR.Js: کلاینت جاوا اسکریپت برای SignalR
  • وابستگی ها نیز شامل: jQuery، Newtonsoft، Json، Microsoft.Owin.Host.SystemWeb، Microsoft.Web.Infrastructure و OWIN.

پکیج های دیگر SignalR را نیز در موارد لازم می توان واکشی کرد:

  • Microsoft.AspNet.SignalR.Client: کلاینت .NET برای SignalR (شامل WinRT، WP8 و Silverlight5).
  • Microsoft.AspNet.SignalR.Redis: روتر پیام رسانی Redis برای مقیاس بندی SignalR در وب فرم.
  • Microsoft.AspNet.SignalR.ServiceBus: روتر پیام رسانی Windows Azure Service Bus برای مقیاس بندی SignalR در وب فرم.
  • Microsoft.AspNet.SignalR.SqlServer: روتر پیام رسانی SQL Server برای پیام رسانی SignalR در وب فرم.
  • Microsoft.AspNet.SignalR.Sample: برای تنظیمات سریع یک سمپل در حال انجام در اپلیکیشن استفاده می شود.

PersistentConnection

PersistentConnection کلاس هسته ای است که برای میزبانی سرویس SignalR در سمت سرور استفاده می شود. اجازه دهید که نحوه استفاده آن را نشان دهیم.

ابتدا، یک ASP.NET web application ایجاد می کنیم و از NuGet برای واکشی پکیج Microsoft.AspNet.SignalR استفاده می نماییم. سپس، کلاس دیگری تعریف می کنیم که از PersistentConnection ارث بری می نماید:

public class MyConnection : PersistentConnection 
{
    protected override Task OnConnected(IRequest request, string connectionId)
    {
        string msg = string.Format(
            "A new user {0} has just joined. (ID: {1})",  
            request.QueryString["name"], connectionId);
        return Connection.Broadcast(msg);
    }
    protected override Task OnReceived(IRequest request, string connectionId, string data)
    {
        // Broadcast data to all clients
        string msg = string.Format(
            "{۰}: {۱}", request.QueryString["name"], data);
        return Connection.Broadcast(msg);
    }
}

 

onConnected زمانی فراخوانی می شود که یک کلاینت به سرویس ما متصل شده باشد. اتصالات با IDهای (GUID) اتصال متمایز می شوند. زمانی که ارتباط برقرار شد کلاینت می تواند برخی اطلاعات را از طریق IRequest.QueryString ارسال نماید. همچنین می توانیم موارد دیگر HTTP مانند coockie، header، اینکه از کجا پست شده و موارد اصلی کاربر را از IRequest به دست آوریم. توجه داشته باشید همه این موارد متعلق به درخواست اول است که درخواست ها برای برقراری ارتباط است.

onRecieved زمانی فراخوانی می شود که داده های کلاینت می رسد. connectionId نشان می دهد که داده ها از کدام اتصال می آید. داده ها در قالب متن هستند. اگر به صورت plain text نمایش داده نمی شود باید خودمان آن را تجزیه (pars) کنیم.

PersistenetConnection.Connection متد Broadcast را برای ارسال یک پیام به همه کلاینت های متصل فراهم می کند؛ همچنین متد Send را برای ارسال یک پیام به یک اتصال خاص یا گروهی از آن ها (با استفاده از نام گروه به عنوان connectionId) فراهم می نماید. هر دو متد لیستی از استثنائات برای اتصالاتی که نمی خواهیم پیامی به آن ها ارسال شود را پشتیبانی می کنند.

می توانیم با استفاده از MyConnection سرویس خود را در جدول route در Global.asax ثبت کنیم:

public class Global : System.Web.HttpApplication 
{
    protected void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.MapConnection("echo", "/echo");
    }
} 

حالا می توانیم جاوا اسکریپت را برای اتصال به سرویس خود در صفحه وب بنویسیم:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head> 
    <title>SignalR Echo</title>
    <script type="text/javascript" src="Scripts/jquery-2.0.3.min.js"></script>   
    <script type="text/javascript" src="Scripts/jquery.signalR-1.1.3.min.js"></script>
</head>
<body>
    <script type="text/javascript">
        function htmlEncode(value) {
            return $("<div/>").text(value).html();
        }
        
        function addMsg(msg) {
            $("#messages").append("<li>" + htmlEncode(msg) + "</li>");
        }
        $(function () {
            $("#join").click(function () {
                var connection = $.connection("/echo", "name=" + $("#name").val(), true);;
                
                connection.received(function (data) {
                    addMsg(data);
                });
                connection.error(function (err) {
                    addMsg("خطا: " + err);
                });
            
                addMsg("در حال اتصال...");
                connection.start(function () {
                    addMsg("متصل شد.");
                    $("#send").click(function () {
                        connection.send($("#msg").val());
                    });
                });
            });
        });
    </script>
    <table>
        <tr>
            <td><span>Name:</span></td>
            <td><input type="text" id="name" /></td>
            <td><input type="button" value="Join" id="join" /></td>
        </tr>
        <tr>
            <td><span>Message:</span></td>
            <td><input type="text" id="msg" /></td>
            <td><input type="button" value="ارسال" id="send" /></td>
        </tr>
    </table>
    <ul id="messages"></ul>
</body>
</html>  

 

حالا اجازه دهید که یک کلاینت .NET ایجاد کنیم. فقط کافی است که یک console application جدید ایجاد کرده و با استفاده از NuGet پکیج Microsoft.AspNet.SignalR.Client را واکشی می نماییم. در Main، از کلاس Connection برای ارتباط با سرویسمان استفاده می کنیم:

class Program  
{
    private const string ServiceUri = "http://localhost:12722/echo";
    static void Main(string[] args) 
    {
        var connection = new Connection(ServiceUri, "name=dzy");
        connection.Received += connection_Received;
        connection.StateChanged += connection_StateChanged;
        Console.WriteLine("در حال اتصال...");
        connection.Start().Wait();
        string inputMsg;
        while (!string.IsNullOrEmpty(inputMsg = Console.ReadLine()))
        {
            connection.Send(inputMsg).Wait();
        }
        connection.Stop();
    }
    static void connection_StateChanged(StateChange state)
    {
        if (state.NewState == ConnectionState.Connected)
        {
            Console.WriteLine("متصل شد.");
        }
    }
    static void connection_Received(string data)
    { 
        Console.WriteLine(data);
    }
} 

برای اینکه ببینیم سرویس روی WebSockets اجرا می شود یا long polling، می توانیم آن را هم روی IIS 7.5 و هم IIS 8.0 روی Windows 8 یا Windows 2012 میزبانی کنیم. توجه داشته باشید که .NET WebSockets فقط روی Windows 8، Windows Server 2012 و بالاتر کار می کند. بنابراین، می توانیم برای بررسی درخواست های HTTP روی ماشین کلاینت از Fiddler استفاده کنیم.

اگر سرویس روی IIS 7.5 میزبانی می شود، درخواست اتصال برقرار نگه داشته می شود:

ASP.NET SignalR

اگر سرویس روی IIS 8 روی Windows 8 یا Windows Server 2012 میزبانی شود، درخواست اتصال تقاضای ارتقا به اتصال WebSocket را دارد:

ASP.NET SignalR

خلاصه

در بخش بعدی، SignalR Hubs، مقیاس بندی و توسعه پذیری را معرفی می کند.



 دانلود فايلهاي پروژه
  • پسورد: www.mspsoft.com


avatar فاطمه زکایی

فاطمه زکایی هستم. فارغ التحصیل کارشناسی مهندسی نرم افزار، مدت سه سال هست که در زمینه توسعه اپلیکیشن های تحت وب و اندروید و همچنین تولید محتوای تخصصی برنامه نویسی تحت وب و اندروید در مجموعه mspsoft در خدمت شما هستم.

آخرین مطالب و تخفیفات در کانال تلگرام :) کانال تلگرام ام اس پی سافت
مطالب مرتبط
ديدگاه خود را ارسال کنيد


محبوب ترين ويدئو هاي انلاين
دوره برنامه نویسی فروشگاه اینترنتی
  • تعداد اعضا 80k
  • قيمت دوره۱۰۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره آموزشی سیستم ثبت سفارش آنلاین
  • تعداد اعضا 80k
  • قيمت دوره۵۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره طراحی سیستم مدیریت مشتریان
  • تعداد اعضا 80k
  • قيمت دوره۵۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...