چگونه از SignalR برای فراخوانی ناهمزمان تابع JavaScript استفاده کنیم؟
چهارشنبه, ۸ مرداد ۱۳۹۳، ۰۴:۱۶ ب.ظ
بسته ی SignalR راهکاری مناسب برای پیاده سازی انتشار غیر همزمان در #C به حساب می یاد. حتما دیدید بعضی سایت ها بدون چک کردن منظم در پس زمینه (polling) هرگونه تغییر رو به صورت آنی نشون میدن!
اگر شما هم دوست دارید از این امکان زیبا بهره ببرید می تونید از SignalR استفاده کنید!
خب برای شروع باید این بسته رو به پروژه تون اضافه کنید؛ برای این کار اگر از 4.5 NET. استفاده می کنید، می تونید با Nuget دریافتش کنید (SignalR 2).
اما اگر از 4 NET. استفاده می کنید باید در بخش Package Manager Console، دستور زیر رو وارد کنید(SignalR 1.1.3):
Install-Package Microsoft.AspNet.SignalR -Version 1.1.3
بعد از نصب، پوشه ی Scripts توی پروژه تون ایجاد میشه که توش چند تا فایل هست!حالا باید فایل Global.asax رو به پروژه تون اضافه کنید تا در شروع کار برنامه، SignalR فراخونی بشه!
حالا تو قسمت Application_Start، این کد رو قرار بدین:
RouteTable.Routes.MapHubs();(حواستون به using ها باشه)
باید یه کلاس به اسم دلخواه که از Hub مشتق میشه هم بسازید:
using Microsoft.AspNet.SignalR;توش فعلا لازم نیست چیزی باشه!
namespace MyProj
{
public class EventHub:Hub
{
}
}
حالا اسکریپت های مربوطه رو به صفحه اضافه کنید:
<script src="/Scripts/jquery-1.6.4.min.js" ></script>حالا برای تابع JavaScript ای که قرار است به طور ناهمزمان ایجاد شود، این کد را اضافه می کنیم:
<script src="/Scripts/jquery.signalR-1.1.4.js"></script>
<script src="/signalr/hubs"></script>
<script>حالا با کد #C زیر می تونید تابع بالا رو فراخوانی کنید(هر وقت این کد اجرا بشه یه فراخوانی ناهمزمان انجام میشه):
$(function () {
var context = $.connection.eventHub;
context.client.refresh = function (someData) {
yourFunction(someData);
};
$.connection.hub.start();
});
</script>
var now = DateTime.Now.ToLongTimeString();مثلا در کد بالا، زمان کنونی به تابع JavaScript ارسال میشه!
var context = GlobalHost.ConnectionManager.GetHubContext<EventHub>();
context.Clients.All.refresh(now);
اگه جایی مبهم بود در نظرات اعلام کنید!