프로젝트에 다른 페이지를 볼 수 있고 자신의 의견이있는 의견 시스템이 있습니다. SqlDependency와 함께 signalR을 사용하여 페이지의 새로운 주석을 자동으로 가져 오려고합니다. 내 문제는 여러 사람이 SqlDependency로 열린 연결을 가지고있는 경우 sqlnotification에서 호출 된 "onchange"이벤트의 수가 곱해지기 시작한다는 것입니다. 한 번 호출되는 onchange 대신 각 사용자에 대해 여러 번 호출됩니다. (그들은 같은 의견 페이지를 볼 수없는 경우에도) I했습니다 거의 소진 모두 여기에 가장 일반적인 응답이 같이라고했을 때이 이벤트를 취소 할 필요가있는과 검색이 didn를SqlDependency OnChange 이벤트를 여러 번 실행하는 중
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
SqlDependency dependency = (SqlDependency)sender;
dependency.OnChange -= new OnChangeEventHandler(dependency_OnChange);
if (e.Info.ToString().ToLower().Trim() == "insert")
{
MyHub.Show();
}
}
저를 위해 무엇이든 바뀌는 것 같아요. 그래서 제가 이것을 막는 최선의 방법이 무엇인지에 대해서는 분실했습니다.
GetData 메서드 :
[WebMethod]
public IEnumerable<DUpdates> GetData(string dnum, string date)
{
if (Common.IsValidInt32(dnum)) //just a function that check for valid int
{
using (var connection =
new SqlConnection(ConfigurationManager.ConnectionStrings["SConnectionString"].ConnectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(@"SELECT [Comment] FROM dbo.DUpdates WHERE (DID = " + dnum + ") AND (Deleted = 0) AND CreateDate > @Date ORDER BY CreateDate DESC", connection))
{
command.Parameters.Add("@Date", SqlDbType.DateTime);
command.Parameters["@Date"].Value = date;
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<IDataRecord>().Select(x => new DUpdates()
{
comment = x.GetString(0)
}).ToList();
}
}
}
}
JS 물건 : 필요한 경우
$(function() {
var job = $.connection.myHub;
job.client.displayStatus = function() {
getData();
};
$.connection.hub.start();
getData();
});
function getData() {
var params = (new URL(document.location)).searchParams;
var id = params.get("id");
var dt = $("#accessdate").val();
$.ajax({
url: 'dupdatesservice.asmx/GetData',
data: JSON.stringify({dnum: id, date: dt}),
contentType: "application/json; charset=utf-8",
dataType: "json",
type: "POST",
success: function (data) {
if (data.d.length > 0) {
$("#testdiv").prepend(data.d[0].comment);
}
}
});
}
다른 코드를 제공 할 수 있습니다.