0

ich SqlDependecy mit signalR bin mit Benachrichtigungen an Client-Browser zu drücken, wenn es einige Datenbankänderungen ist, folgte ich this und this Post und alles funktioniert in lokaler SqlExpress Version 11.0 mit Local Connection String, aber ich habe eine Art von Berechtigungen Problem, wenn ich auf Remote-Datenbank in GoDaddy mit Produktions Connection StringKann nicht das Objekt „QueryNotificationErrorsQueue“ finden, weil es nicht oder Sie haben existiert keine Berechtigungen

Arbeits lokalen Connection

gehostet verbinden 210

Produktion Connection

<add name="NotifyConnection" connectionString="Server=000.00.00.000;Database=TestDB; 
User Id=UserName;Password=YourPassword;" providerName="System.Data.SqlClient" /> 

Daten Methode Get

public IEnumerable<Order> GetData() 
{ 

using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings 
["NotifyConnection"].ConnectionString)) 
{ 

using (SqlCommand command = connection.CreateCommand()) 
{ 

command.CommandType = CommandType.Text; 

command.CommandText = "SELECT OrderID,CustomerID FROM dbo.[RestUser]"; 

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>() // Here the Error throws 
     .Select(x => new Order() 
     { 
     OrderID = x.GetInt32(0), 
     CustomerID = x.GetInt32(1)     
     }).ToList(); 


} 
} 
} 

Was ich versucht habe?

Ich folgte diesem post, um Berechtigungen in SQL Server zu gewähren, aber nicht sicher ist diese korrekte Methode zu folgen.

USE YourDatabaseName; 

CREATE QUEUE NameChangeQueue; 

CREATE SERVICE NameChangeService ON QUEUE NameChangeQueue ([http://schemas.microsoft.com/ 
SQL/Notifications/PostQueryNotification]); 

GRANT SUBSCRIBE QUERY NOTIFICATIONS TO YourUserName; // Here i get this error: 

//Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, 
    sys, or yourself. 

ALTER DATABASE YourDatabaseName SET ENABLE_BROKER; // Broker is already enabled 

Screen Shot:

enter image description here

Ich bin neu in SqlDependency, wie dieses Problem zu beheben?

Jede Hilfe wäre großartig.

+0

Überprüfen Sie die Netzwerk- und Authentifizierungsüberlegungen in [dieser Antwort] (http://stackoverflow.com/a/8316200/707618). Außerdem rufen Sie in Ihrem Code ['SqlDependency.Start()'] (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldependency.start (v = vs.110) .aspx)? – Smudge202

+0

@ Smudge202 Danke für den Kommentar, ich rufe es in 'Appliaction_Start' an, und wir planen, nach azur zu gehen, aber in azurblauen' SqlDependency' wird nicht unterstützt, also bekommen wir [diese] (http://stackoverflow.com/ Fragen/33693020/azure-sql-server-Fehler-Anweisung-receive-msg-ist-nicht-unterstützt-in-dieser-Version) Fehler geplant für [Auslöser] (http://stackoverflow.com/questions/ 9880091/monitor-data-changes-in-sql-azure) um Datenbankänderungen mit signaR zu verfolgen, irgendwelche besseren Vorschläge? – stom

+1

Persönlich bin ich kein großer Fan von entweder SqlDependency noch Trigger Ansätze. Stattdessen würde ich in Erwägung ziehen, Nachrichten an einen Service Bus (oder eine Warteschlange in irgendeiner Form) zu veröffentlichen. Ein Listener kann die Daten in der Datenbank persistieren (wie Sie jetzt sicher sind), während ein anderer Listener Ihre SignalR Push-Benachrichtigungen verarbeiten kann. Es löst nicht nur dieses Problem, sondern bietet Ihnen auch eine Widerstandsfähigkeit gegen Serviceausfälle. Das ist, wie ich es annähme, aber ich verstehe, dass Ihre SqlDependency-Probleme nicht direkt aufgelöst werden, sorry. – Smudge202

Antwort

0

In Shared-Hosting, weil sie einige Funktionen beschränken, so war ich nicht in der Lage SqlDependency zu verwenden, aber hier ist meine Lösung Play-Benachrichtigungen ohne SqlDependency in asp mvc

Wenn Sie neue signalR sind, dann versuchen Sie zunächst this Post, um einfache Chat-Webanwendung zu erstellen.

war Meine Forderung Benachrichtigungen zu spielen, wenn neue Vertriebs in Geschäften geschieht

1. Erstellen SignalR Server Hub

SignalR Server Hub-Klasse, die Nachrichten an alle Clients Browser sendet.

[HubName("PascalCaseNewSalesHub")] 
public class NewSalesHub : Hub 
{ 

    public void Send(string shopid) 
    { 
     // Call the alertNewSalesToPage method to update clients. 

     Clients.All.alertNewSalesToPage(shopid); 
    } 

} 

2. Javascript senden Methode in PlaceOrder anzeigen

Wenn ein Kunde für diesen Shop neuen Auftrag setzt dann den folgenden JavaScript-Code ruft die Methode Send auf dem Server Hub-Clients zu aktualisieren.

<script> 

$(function() 
{ 
// Reference the auto-generated proxy for the hub. 
var chat = $.connection.PascalCaseNewSalesHub; 

var thisShopID = @(ViewBag.ShopID); 


// Start the connection. 
$.connection.hub.start().done(function() { 

// Call the Send method on the hub to send this shops ID 

chat.server.send(thisShopID); 


}); 
}); 

3.JavaScript Client Rückrufmethode in der ShopSales-Ansicht

Die Hub-Klasse auf dem Server ruft diese JavaScript-Funktion auf, um Inhaltsaktualisierungen an jeden Client zu senden.

<script type="text/javascript"> 
$(function() 
{ 

console.log('Page loaded'); 

// Declare a proxy to reference the hub. 

var notifications = $.connection.PascalCaseNewSalesHub; 

if (notifications != null) 
{ 
console.log('connected to SalesHUB proxy'); 
} 

var thisShopID = @(ViewBag.ShopID); 

// Create a function that the hub can call back to alert new sales. 

notifications.client.alertNewSalesToPage = function (shopid) 
{ 
// check if sales happened for this shop then play notification 

if (shopid == thisShopID) 
{ 

var sound =new Howl({ 
      src: ['../sounds/rings.mp3','../sounds/rings.wav','../sounds/rings.ogg', 
      '../sounds/rings.aiff'], 
      autoplay: true, 
      loop: true 
      }); 

      sound.play(); 

      $('#loading').show(); 

      // Partial View to Update LatestSales for this Shop 

      $("#new-Sales").load('@Url.Action("GetLatestSales", "Shop")') 

      $('#loading').hide(); 

      console.log('New Sale happened, Notification Played'); 
     } 

    }; 


    // Start the connection. 
    $.connection.hub.start().done(function() { 


     console.log('signalR connection started'); 


    }).fail(function (e) { 
     alert(e); 
    }); 
}); 



</script> 

Gebrauchte Howler.js Plugin Benachrichtigung zu spielen, überprüfen this Post.

Hoffnung hilft jemandem.