摘要:SignalR 與 SqlDependency 建立ASP.NET realtime應用
近期接觸到一個案例,需求為當資料庫有新的異動時,需即時更新Client端的Datagrid,但不需要一直request去檢查資料造成負擔,
於是乎google不少資料,決定用SqlDependency監看資料表異動 並由Onchange事件觸發hub 裏頭的動態方法 操作client端(SignalR framework ),其原理 可參考http://blogs.msdn.com/b/msdntaiwan/archive/2013/09/09/signalr-reimagine-web-development.aspx
以下直接Step by Step
步驟一
於參考點選管理Nuget套件
步驟二
安裝SignalR 2.0.1
步驟三
於App_Code加入OWIN
加入Code
using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(SignalRDEMO.Startup1))]
namespace SignalRDEMO
{
public class Startup1
{
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
app.MapSignalR();
}
}
}
步驟四
加入Hub類別
加入Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
namespace SignalRDEMO
{
[HubName("SignalRDEMOHub")]
public class SignalRDEMOHub : Hub
{
public void SetState()
{
GetData ss = new GetData();
ss.GetStudentData();
}
public static void ShowData()
{
// 呼叫用戶端方法
var context = GlobalHost.ConnectionManager.GetHubContext();
context.Clients.All.SetState();
}
}
}
步驟五
建立SqlDependency 連線 與OnChange事件
using SignalRDEMO;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
///
/// GetData 的摘要描述
///
public class GetData
{
public GetData()
{
//
// TODO: 在這裡新增建構函式邏輯
//
}
public class StudentData
{
public int ID { get; set; }
public string Name { get; set; }
}
public IEnumerable GetStudentData()
{
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(@"SELECT [ID]
,[Name]
FROM [dbo].[Students]
", connection))
{
command.Notification = null;
SqlDependency dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
if (connection.State == ConnectionState.Closed)
connection.Open();
using (var reader = command.ExecuteReader())
return reader.Cast()
.Select(x => new StudentData()
{
ID = x.GetInt32(0),
Name = x.GetString(1),
}).ToList();
}
}
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
//這裡是觸發異動事件
SignalRDEMOHub.ShowData();
}
步驟六
加入.asax
void Application_Start(object sender, EventArgs e)
{
// 在應用程式啟動時執行的程式碼
System.Data.SqlClient.SqlDependency.Start(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
}
void Application_End(object sender, EventArgs e)
{
// 在應用程式關閉時執行的程式碼
System.Data.SqlClient.SqlDependency.Stop(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
}
步驟七
設計一個Default.aspx 並且放入Gridview 搭配updatepanel
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<div style="display: none">
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</div>
<asp:GridView ID="GridView1" runat="server"></asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
------------------------------------------------------------------------------------------------------------------------------------------------------------
參考自
http://techbrij.com/database-change-notifications-asp-net-signalr-sqldependency