ورود

View Full Version : آموزش: ارسال notification توسط ASP.NET



sds1920
شنبه 16 اردیبهشت 1391, 13:42 عصر
سلام خدمت همه دوستان.
مدت ها بود که خودم دنبال همچين امکاني براي وب سايتم مي گشتم.منبع فارسي که پيدا نکردم از هر کسي هم که توي سايت پرسيدم نتونست کمکم کنه.

بالاخره بعد از تلاش زياد تونستم ياد بگيرم چطوري با ASP.Net براي کاربران سايت Notification ارسال کنم و وظيفه ي خودم مي دونم اين رو توي سايت قرار بدم تا ديگران مثل من وقتشون از بين نره و به راحتي از اون استفاده کنن.

پس در اين پست مرحله مرحله براي ساخت notification جلو مي ريم تا وقتي که بتونيم سايت رو روي هاست خودمون قرار بديم و ازش استفاده کنيم.

من مرحله ي اول رو براتون شرح مي دم ولي اگه دوست داريد تا آخر ادامه بدم بايد حداقل 5 نفر توي هر مرحله تشکر کنن تا خستگي تايپ کردن از تنم بيرون بره:لبخند:

sds1920
شنبه 16 اردیبهشت 1391, 14:36 عصر
مرحله اول
ابزار مورد نياز
1)Visual Studio 2010
2)Package Management Consol
3)پکيج SignalR
گزينه ي اول که نياز به توضيح نداره و بايد خودتون Visual Studio 2010 رو روي سيستم خودتون نصب کنيد.از اين به بعد منظورم از VS همون Visual Studio 2010 هست.

اما گزينه دوم.
براي اينکه شما بتونيد از Package Management Consol استفاده کنيد بايد دوتا برنامه کوچيک روي سيستم نصب کنيد(البته بعد از نصب VS)اين دوتا برنامه يکي NuGet.Tools هست و ديگري PowerShell 2.0 که مي تونيد از لينک هاي زير دانلو و نصب کنيد:

NuGet.Tools :
http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c/file/37502/21/NuGet.Tools.vsix

PowerShell 2.0:
http://support.microsoft.com/kb/968929
بايد در پايين صفحه ،PowerShell رو متناسب با سيستم عامل خودتون انخاب کنيد.عکس زير تمام سيستم عامل ها رو نشون مي ده.

http://www.up.98ia.com/images/e1fb0809uk9r1duss2it.jpg

بعد از نصب اين دوتا برنامه شما آماده شديد تا پکيج SignalR که کار اصلي را براي ما انجام مي ده رو نصب کنيد.اما اين پکيج بايد روي يک وب سايت يا پروژه نصب بشه و نمي شه هميجوري روي هوا نصبش کرد.
پس شما VS رو باز کنيد.
از منوي فايل يک وب سايت جديد ايجاد کنيد.دقت کنيد که پروژه وب ايجاد نکنيد و يک وب سايت ايجاد کنيد. يعني به صورت زير عمل کنيد :

Open Visual Studio --> File --> New --> Web Site…

حالا مطابق با عکس زير يک ASP.NET Web Site ايجاد کنيد.

http://www.up.98ia.com/images/qghbk0somzf2o40nqk.jpg

وقتي وب سايت رو ساختيد بايد پکيج SignalR رو نصب کنيد.براي اين کار به منوي Tools رفته و مسير زير رو طي کنيد :

Tools --> Library Package Manager --> Package Manager Consol

بعد از اين کار قسمتي شبيه به عکس زير براي شما به نمايش درمي آيد:

http://www.up.98ia.com/images/t9mm6nwuyhezhcxiy270.jpg

حالا دستور زير رو در Package Manager Consol وارد کنيد و منتظر بشيد تا پکيج مورد نظر نصب بشه.

Install-Package SignalR

اين کار ممکنه حدود 10 دقيقه طول بکشه پس نگران نباشيد.(اگر با خطايي روبرو شديد مقدار Package Source رو All کنيد).وقتي نصب تموم بشه پيام زير به شما نمايش داده مي شه.

http://www.up.98ia.com/images/gkl1sjz7zs7iweou36u.jpg

بعد از اين مراحل وب سايت شما آماده شده تا کدها و صفحات رو براش ايجاد کنيم.
در اينجا مرحله اول آموزش تموم مي شه و در آينده نزديک مرحله دوم رو هم به شما آموزش مي دم.

sds1920
شنبه 16 اردیبهشت 1391, 18:57 عصر
مرحله دوم
ساخت کلاس Connection
بعد از اينکه پکيج SignalR رو اضافه کرديد بايد يک کلاس ايجاد کنيد تا اطلاعات رو براي ما Broadcast بکنه.
پس در Solution Explorer رو فولدر App_Code کليک راست کرده و گزينه Add New Item... را انتخاب کنيد.در پنجره اي که باز مي شه يک کلاس به نام MyConnection ايجاد کنيد.


http://www.up.98ia.com/images/hud9zxljsoy5cuhiu6uy.jpg


حالا کلاس MyConnection را باز کنيد و تمام کدهاي اون را پاک کنيد و کد هاي زير رو در اون کپي کنيد.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Threading.Tasks;
using SignalR;
using SignalR.Hubs;

public class MyConnection : PersistentConnection
{
protected override Task OnReceivedAsync(string connectionId, string data)
{
// Broadcast data to all clients
return Connection.Broadcast(data);
}
}

sds1920
شنبه 16 اردیبهشت 1391, 19:06 عصر
مرحله سوم
تغيير Global.asax
هر زماني که کاربري به سايت وارد مي شه بايد به جدول مسيريابي اضافه بشه تا بتونيم براي اون اطلاعات رو ارسال کنيم و اين کار رو مي تونيم با وارد شدن کاربر به سايت انجام بديم.پس فايل Global.asax رو باز کنيد و کدهاي اون رو مثل کدهاي زير بنويسيد.توصيه مي کنم اين قسمت رو به صورت دستي انجام بديد و تماما Copy/Paste نکنيد.
اگر فايل Global.asax وجود نداره روي نام سايت توي Solution Explorer کليک راست کرده و Add New Item... رو انتخاب کنيد و يک Global Application Calss اضافه کنيد.




<%@ Application Language="C#‎‎‎‎" %>

<%@ Import Namespace="System.Web.Routing" %>
<%@ Import Namespace="SignalR.Hosting.AspNet.Routing" %>

<script runat="server">

void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
RouteTable.Routes.MapConnection<MyConnection>("echo", "echo/{*operation}");
}

void Application_End(object sender, EventArgs e)
{
// Code that runs on application shutdown

}

void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs

}

void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started

}

void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set to StateServer
// or SQLServer, the event is not raised.

}

</script>

sds1920
شنبه 16 اردیبهشت 1391, 19:20 عصر
مرحله چهارم
ساختن صفحه ارسال کننده notification
بعد از اينکه مراحل بالا رو با موفقيت انجام داديد بايد يک فرم وب به سايت خودتون اضافه کنيد.طبق معمول روي نام سايت توي Solution Explorer کليک راست کرده و Add New Item... رو انتخاب کنيد و يک Web Form اضافه کنيد.نام اين فرم رو Admin بذاريد.

حالا روي Admin.aspx دابل کليک کرده و به نماي Source بريد.تمام کدها رو پاک کرده و کدهاي زير رو در اون کپي کنيد :



<%@ Page Language="C#‎" AutoEventWireup="true" CodeFile="Admin.aspx.cs" Inherits="Admin" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
<script src="Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR.min.js" type="text/javascript"></script>
</head>
<body>
<form id="form1" runat="server">
<div>
<script type="text/javascript">
$(function () {
var connection = $.connection('echo');
connection.received(function (data) {
$('#messages').append('<li>' + data + '</li>');
});
connection.start();
$("#broadcast").click(function () {
connection.send($('#msg').val());
});
});
</script>
<input type="text" id="msg" />
<input type="button" id="broadcast" value="broadcast" />
<ul id="messages">
</ul>
</div>
</form>
</body>
</html>

sds1920
شنبه 16 اردیبهشت 1391, 19:25 عصر
مرحله پنجم
ساخت صفحه کاربر يا صفحه اي که اطلاعات رو دريافت مي کنه.
شبيه مرحله قبل يک Web Form ساخته و اينبار نام اون رو Client بگذاريد و کدهاي زير رو در اون بنويسيد :




<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Client.aspx.cs" Inherits="Client" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
<script src="Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR.min.js" type="text/javascript"></script>
<style type="text/css">
#Notifications{position:fixed; z-index:10; bottom:20px; left:100px; width:250px; overflow:hidden;}
#Notifications .notify {margin:10px; border:solid 1px #999; background:#FFFFD5; display:none;}
#Notifications .notify .text{padding:10px; font:10pt tahoma; color:#333;}
#Notifications .notify .btnClose{float:right;padding: 1px;margin:3px; width:10px; text-align:center;
border:solid 1px #777; background:#ccc; font:bold 7pt Arial; color:#555; cursor:pointer;}
#Notifications .notify .btnClose:hover{background:#555; color:#ccc}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<script type="text/javascript">
$(function () {
// Proxy created on the fly
var connection = $.connection('echo');

connection.received(function (data) {
var closebtn = "<div class=\"btnClose\">X</div>";
var text = "<div class=\"text\">" + data + "</div>";
$('#Notifications').append('<div class=\"notify\">' + closebtn + text + '</div>');
$(".notify").show(200);
});
connection.start();
$('.btnClose').live("click", function (e) {
$(this).parent().remove();
});
});

</script>
<ul id="messages">
</ul>

<div id="Notifications">
</div>
</div>
</form>
</body>
</html>

sds1920
شنبه 16 اردیبهشت 1391, 19:27 عصر
الان وب سايت ما آماده شد.مي تونيد اون را Run کنيد و از اون استفاده کنيد.فقط مونده قسمت Publish کردن سايت که بعدا توضيح خواهم داد.

elham1611
شنبه 16 اردیبهشت 1391, 23:30 عصر
ممنون ولی من کلا تو آفساد هستم قضیه این notifition چی هست؟ یعنی مثلا اگه textbox خالی بود به کاربر بگه خالیه یا اینکه صفحه دارای خطا رو درست کنه؟

sds1920
یک شنبه 17 اردیبهشت 1391, 07:54 صبح
ممنون ولی من کلا تو آفساد هستم قضیه این notifition چی هست؟ یعنی مثلا اگه textbox خالی بود به کاربر بگه خالیه یا اینکه صفحه دارای خطا رو درست کنه؟

نه دوست عزيز.يکي از ويژگي هاي پروتکل وب بر مبناي درخواست/پاسخ هست.يعني اول کاربر درخواست رو ارسال مي کنه و بعد سرور پاسخ مي ده.ولي در مورد notification داستان فرق مي کنه و نيازي به ارسال در خواست کاربر نيست. بعضي اوقات به اين نوع ارتباط ،ارتباط ناهمگام(Asynchron) هم مي گن.
يک مثال بگم که بهتر متوجه بشيد.مثلا شما توي يک سايت وارد مي شيد و داريد کارتون رو انجام مي ديد که روي صفحه يه پيغام ظاهر ميشه و ميگه "شما يک پيغام جديد داريد".اين درحالي هست که شما هنوز صفحه رو به سرور ارسال نکردين و اين پيغام از طرف سرور براي شما ارسال شده.در واقع براي ارسال اطلاعات از سرور به کلاينت بدون درخواست کلاينت هست.

EnKamran
یک شنبه 17 اردیبهشت 1391, 10:01 صبح
آقا دیشب کلی خوشحال شدم اومدم کار کنم دیدم توی فایل Global اون MyConnection که داخل <> گذاشتیم رو نمیشناسه هر کاری هم کردم نشد، کلاس MyConnection هم که درست کردیم پابلیکه باید بشناسه اما نشناخت :(

ASP.NET2
یک شنبه 17 اردیبهشت 1391, 11:03 صبح
سلام
دستت درد نکنه .
ولی این PowerShell که گفتی دانلود برا win 7 نداره !
و یه سوال دیگه اینکه notification رو برا کدوم یوزر داریم ارسال میکنیم .که اینجا برا همه یوزرها هستش. امکان داره تو سایتمون چندین کاربر آنلاین وجود داشته باشه!
و اگه ممکن هستش سورس پروژه رو هم share کنی که خیلی خوب میشه.
موفق باشی

EnKamran
یک شنبه 17 اردیبهشت 1391, 12:46 عصر
واسه همه کاربرا داریم اریال میکنیم، همونطور که دوستمون توضیح دادن دارم اطلاعات جدید رو Push میکنیم، به سیستم چت گوگل دقت کنید، همچین حالتی داره تقریبا

sds1920
یک شنبه 17 اردیبهشت 1391, 20:13 عصر
آقا دیشب کلی خوشحال شدم اومدم کار کنم دیدم توی فایل Global اون MyConnection که داخل <> گذاشتیم رو نمیشناسه هر کاری هم کردم نشد، کلاس MyConnection هم که درست کردیم پابلیکه باید بشناسه اما نشناخت :(

بايد کلاس MyConnection رو توي App_Code درست کنيد.
اگر بازم موفق نشديد به Global.asax رفته و موس رو روي اسم کلاس نگه داريد تا يه گزينه کنارش بياد که سوال مي کنه يه کلاس جديد اضافه کنه يا نه.همين جا که اضافه کنيد درست مي شه.

sds1920
یک شنبه 17 اردیبهشت 1391, 20:31 عصر
ولی این PowerShell که گفتی دانلود برا win 7 نداره !


مثل اينکه براي سيستم عامل 7 نداره.به عکس زير يه نگاه بندازيد :


http://www.up.98ia.com/images/j0231gcspgyh315ffdf.jpg


شما بعد از نصب NuGet.Tools به ويژوال بريد و Package Manager Consol رو باز کنيد.اگه پيغامي براي PowerShell نداد مي تونيد نصبش کنيد.

sds1920
یک شنبه 17 اردیبهشت 1391, 20:37 عصر
اگه ممکن هستش سورس پروژه رو هم share کنی که خیلی خوب میشه.


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

sds1920
دوشنبه 18 اردیبهشت 1391, 10:10 صبح
اگه ممکن هستش سورس پروژه رو هم share کنی که خیلی خوب میشه.

يه راهي به ذهنم رسيد براي اينکه سورس کدها رو به شما بدم.
اول شما يک وب سايت به اسم Send Notification بسازيد و پکيج SignalR رو روي اون نصب کنيد.
بعد به فولدري که فايلهاي وب سايت هست بريد و فايل هاي زير رو توش کپي کنيد.
اميدوارم که حل بشه.

86764

Hossein1429
پنج شنبه 25 خرداد 1391, 00:14 صبح
سلام
ميخواستم بپرسم شما با ويژوال استديو 2010 نوشتيد يا 2012؟
فقط پكيج SignalR رو نصب كرديد؟
چون براي من هر كاري كه ميكنم دو تا ارور ناجور ميده

اولي براي MyConnection.cs
كه مربوطه به متد override OnReceivedAsync كه ارورش ميگه:

'MyConnection.OnReceivedAsync(string, string)': no suitable method found to override
چون متد اصلي اينه:


OnReceivedAsync(IRequest, string, string)


دومي مربوط ميشه به Global.asax
كه از كد:

RouteTable.Routes.MapConnection<MyConnection>("echo", "echo/{*operation}");
خطا ميگيره و ميگه :
'System.Web.Routing.RouteCollection' does not contain a definition for 'MapConnection' and no extension method 'MapConnection' accepting a first argument of type 'System.Web.Routing.RouteCollection' could be found (are you missing a using directive or an assembly reference?)

حالا هر كارش ميكنم درست نميشه
كي ميتونه جواب بده كه يه هفته هست گير افتادم

در ضمن هم SignalR رو روي پروژه نصب كردم هم با ويژيوال استديو هاي مختلف امتحان كردم
هر كاري بگيد كردم جواب نگرفتم

با تشكر قبلي و قلبي

Hossein1429
پنج شنبه 25 خرداد 1391, 07:54 صبح
:عصبانی::عصبانی::عصبانی::عصب نی::عصبانی:

كسي جواب نميده

:عصبانی::عصبانی::عصبانی::عصب نی::عصبانی:

forodo007
پنج شنبه 29 تیر 1391, 11:07 صبح
سلام با تشکراز این تاپیک جالب ولی برنامه شما در مورد کلاس connection error میده من هم هر کاریش کردن جواب نداد ایا باید متد رو عوض کنیم چون من هم خیلی دنبال این برنامه بودم.

Mohandes2009
پنج شنبه 29 تیر 1391, 12:05 عصر
مرحله اول
ابزار مورد نياز
بعد از نصب اين دوتا برنامه شما آماده شديد تا پکيج SignalR که کار اصلي را براي ما انجام مي ده رو نصب کنيد.اما اين پکيج بايد روي يک وب سايت يا پروژه نصب بشه و نمي شه هميجوري روي هوا نصبش کرد..

اینا تو VS2008 چجوری نصب کنیم؟