2017-04-05 2 views
0

방금 ​​SignalR을 사용하고 다른 구성 및 여러 질문에 따라 설치 구성을 시작했습니다. 나는 매 단계마다 따라왔다. 종속성 OnChange이 실행되지 않는 이유를 알아낼 수 없습니까?SqlDependency.OnChange dependency_OnChange가 실행되지 않았습니다.

[HubName("broadcastHub")] 
public class BroadcastHub : Hub 
{ 
    [HubMethodName("sendNotifications")] 
    public Task<object> SendNotifications() 
    { 
     DataTable dt = new DataTable(); 
     using (var connection = new SqlConnection(strConnectionString)) 
     { 
      connection.Open(); 
      using (SqlCommand command = new SqlCommand(query, connection)) 
      { 
       command.Notification = null; 
       SqlDependency dependency = new SqlDependency(command); 
       dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 
       var reader = command.ExecuteReader(); 
       dt.Load(reader); 
       connection.Close(); 

      } 
     } 
     IHubContext context = GlobalHost.ConnectionManager.GetHubContext<BroadcastHub>(); 
     var json = Newtonsoft.Json.JsonConvert.SerializeObject(dt); 
     return (context.Clients.All.RecieveNotification(json)); 
    } 
    private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     if (e.Type == SqlNotificationType.Change) 
     { 
      SendNotifications(); 
     } 
    } 
} 

처음에는 정상적으로 작동하며 예상되는 데이터를 얻습니다. 변경이 표에서 이루어집니다하지만 그것은 dependency_OnChange

가 나는 또한 브로커 서비스는 다음과 같은 쿼리를 사용하여 설정되어 있는지 확인한 발생하지 않습니다 - 모두 enabled과 가치를하다

select is_broker_enabled from sys.databases where name='msdb' 
select is_broker_enabled from sys.databases where name='mydb' 

1입니다. 내가 SendNotifications에서 사용하고

쿼리는 다음과 같습니다 -

select Id,OXEName,OXEIP IP,ConnectionStatus Status, Case WHEN ConnectedOxeIP IS NULL OR ConnectedOxeIP = '' THEN OXEIP ELSE ConnectedOxeIP END as ConnectedOxeIP from PBXDetail

자바 스크립트

$(function() { 
    var notifications = $.connection.broadcastHub; 
    notifications.client.recieveNotification = function (response) { 
    }; 
    $.connection.hub.start().done(function() { 
     notifications.server.sendNotifications(); 
    }).fail(function (e) { 
    });    
}); 

에게

[assembly: OwinStartup(typeof(myNameSpace.Startup))] 
namespace myNameSpace 
{ 
    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      app.MapSignalR(new HubConfiguration() { EnableJSONP = true }); 
     } 
    } 
} 
Startup.cs

Global.asax에

protected void Application_Start(object sender, EventArgs e) 
{ 
    System.Data.SqlClient.SqlDependency.Start(strConnectionString); 
} 

protected void Application_End(object sender, EventArgs e) 
{ 
    System.Data.SqlClient.SqlDependency.Stop(strConnectionString); 
} 

답변

1

나는 그것을 파악하고 이러한 유형의 문제에 직면한다 미래의 독자가 그것을 알아낼 수있을 것이다 그래야 답변으로 게시했다.

나는 코드의 조각을 디버깅 내가 dependency_OnChange에서 SqlNotificationEventArgs의 값으로 다음과 같은 매개 변수를 얻는 것을 발견하고 그 있었다 :

Info => Invalid 
Type => Subscribe 
Source => Statement 

정보는이 문제가 있음을 알고 저를 이끌어 무효 인 경우 내 질문. 그런 다음 쿼리 구문을 다음과 같이 변경하여 정상적으로 작동합니다.

select * from table // did not work 
select ID from table // did not work 
select [ID] from table // did not work 
select [ID] from dbo.table // Worked 

을 내가 모든 페이지에 dependency_OnChange이 페이지를 새로 고침이었다 여러 번 발사 된 새로 발견 한이 일 후 : 다음

select [Id],[OXEName],[OXEIP] as [IP],[ConnectionStatus] as [Status], Case WHEN [ConnectedOxeIP] IS NULL OR [ConnectedOxeIP] = '' THEN [OXEIP] ELSE [ConnectedOxeIP] END as [ConnectedOxeIP] from dbo.PBXDetail 

내가 찾은 쿼리 상태입니다. 예를 들어 페이지가 10 번 새로 고침되면 10 번 실행됩니다. 그래서 만든 다음 변경 :

[HubMethodName("sendNotifications")] 
public Task<object> SendNotifications() 
{ 
    DataTable dt = new DataTable(); 
    using (var connection = new SqlConnection(strConnectionString)) 
    { 
     connection.Open(); 
     using (SqlCommand command = new SqlCommand(query, connection)) 
     { 
      command.Notification = null; 
      if (ServiceController.dependency == null) 
      { 
       ServiceController.dependency = new SqlDependency(command); 
       ServiceController.dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 
      } 
      var reader = command.ExecuteReader(); 
      dt.Load(reader); 
      connection.Close(); 
     } 
    } 
    IHubContext context = GlobalHost.ConnectionManager.GetHubContext<BroadcastHub>(); 
    var json = Newtonsoft.Json.JsonConvert.SerializeObject(dt); 
    return (context.Clients.All.RecieveNotification(json)); 
} 

private void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
{ 
    if (e.Type == SqlNotificationType.Change) 
    { 
     if (ServiceController.dependency != null) 
     { 
      ServiceController.dependency.OnChange -= dependency_OnChange; 
      ServiceController.dependency = null; 
     } 
     SendNotifications(); 
    } 
} 

ServiceController

public static class ServiceController 
{ 
    internal static SqlCommand command = null; 
    internal static SqlDependency dependency = null; 
    internal static bool isCachingEnabled = false; 
} 

Global.asax에

protected void Application_Start(object sender, EventArgs e) 
{ 
    if (!ServiceController.isCachingEnabled) 
    { 
     SqlDependency.Stop(strConnectionString); 
     SqlDependency.Start(strConnectionString); 
    } 
}