0

Я использую SqlDependecy с signalR нажать уведомления в браузер клиента, когда есть некоторые изменения в базе данных, я последовал this и this поста и все работает отлично в локальной SqlExpress версии 11.0 с локальной строки подключения, но у меня есть какие-то проблемы разрешений, когда я подключиться к удаленной базе данных, размещенной в GoDaddy с колонной ПодключениеНе удается найти объект «QueryNotificationErrorsQueue», потому что не существует или у вас нет разрешения

Рабочая Местное ConnectionString

<!--<add name="NotifyConnection" providerName="System.Data.SqlClient" connectionString= 
"Data Source=.\SQLExpress;Initial Catalog=TestDB;Integrated Security=SSPI;" />--> 

Производство ConnectionString

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

Получ данных

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(); 


} 
} 
} 

Что я попробовал?

Я последовал за этим post, чтобы получить разрешения на сервере sql, но не уверен, что это правильный метод.

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

Я новичок в SqlDependency, как решить эту проблему?

Любая помощь будет отличной.

+0

Ознакомьтесь с соображениями сетевой и аутентификации в [этом ответе] (http://stackoverflow.com/a/8316200/707618). Кроме того, где в коде вы вызываете ['SqlDependency.Start()'] (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldependency.start (v = vs.110) .aspx)? – Smudge202

+0

@ Smudge202 Спасибо за комментарий, я вызываю его в 'Appliaction_Start', и мы планируем перейти на azure, но в лазурной строке' SqlDependency' не поддерживается, поэтому мы получаем [this] (http://stackoverflow.com/ вопросы/33693020/azure-sql-server-error-statement-receive-msg-is-not-supported-in-this-version), которые планируется использовать для [триггеров] (http://stackoverflow.com/questions/ 9880091/monitor-data-changes-in-sql-azure), чтобы отслеживать изменения базы данных с помощью signaR, любые лучшие предложения? – stom

+1

Лично я не большой поклонник подхода SqlDependency и Trigger. Вместо этого я бы рассмотрел возможность публикации сообщений на служебной шине (или в очереди какой-то формы). Один слушатель может сохранять данные в базе данных (как я уверен, что вы сейчас это делаете), в то время как другой слушатель может обрабатывать ваши push-оповещения SignalR. Он не только решает эту проблему, но и дает вам уровень устойчивости к отключению службы. Вот как я подхожу к нему, но я понимаю, что это не решает проблемы SqlDependency напрямую, извините. – Smudge202

ответ

0

В хостингом, потому что они ограничивают некоторые особенности, поэтому я не смог использовать SqlDependency, но вот мое решение уведомлений Play без SqlDependency в осины MVC

Если вы новичок signalR, то попробуйте сначала this для создания простого веб-приложения чата.

Мое требование было играть уведомления, когда новые продажи происходят в магазинах

1. Создание SignalR сервер Hub

SignalR сервер класс хаб, который посылает сообщения всех клиентов браузера.

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

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

     Clients.All.alertNewSalesToPage(shopid); 
    } 

} 

2. Javascript Отправить метод в PlaceOrder View

Когда клиент размещает новый заказ для этого магазина, то следующего яваскрипт кода вызывает метод отправки на хаб сервера для обновления клиентов.

<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 Call Back Method в ShopSales View

Класс хаба на сервере вызывает эту функцию javascript, чтобы выталкивать обновления содержимого каждому клиенту.

<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> 

Используется Howler.js плагин для воспроизведения уведомления, проверьте this пост.

Надежда помогает кому-то.

 Смежные вопросы

  • Нет связанных вопросов^_^