Я установил пример приложения ASP.NET MVC signalR с помощью брокера служб SQL Server. Я использовал учебник в
https://www.codeproject.com/articles/874240/signalr-database-update-notifications-in-asp-net-m
Я также установил для своей базы данных ALTER DATABASE BlogDemos SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE;
Я использую SQL 2012, иногда он вызывается клиентской функцией с ENABLE_BROKER, но вызывается не каждый раз.
У меня есть пара вопросов:
1) Когда я обновляю и изменяю запись в базе данных, на клиентском сайте ничего не происходит, если я снова не выполню следующий запрос:
ALTER DATABASE Your_DB_Name SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE;
хотя иногда на клиентском сайте не происходит никаких изменений даже после выполнения этого запроса.
2) После выполнения вышеуказанного запроса (... ENABLE_BROKER ...) требуется 10 секунд , чтобы увидеть изменения на стороне клиента
3) Функция GetMessages вызывается пару раз с задержкой около 10 секунд.
Hub :
MessageHubs.cs:
namespace SignalRDbUpdates.Hubs
{
public class MessagesHub : Hub
{
private static string conString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();
[HubMethodName("sendMessages")]
public static void SendMessages()
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MessagesHub>();
context.Clients.All.updateMessages();
}
}
}
MessagesRepository.cs
namespace SignalRDbUpdates.Models
{
public class MessagesRepository
{
readonly string _connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
public IEnumerable<Messages> GetAllMessages()
{
var messages = new List<Messages>();
using (var connection = new SqlConnection(_connString))
{
connection.Open();
using (var command = new SqlCommand(@"SELECT [MessageID], [Message], [EmptyMessage], [Date] FROM [dbo].[Messages]", connection))
{
command.Notification = null;
var dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
if (connection.State == ConnectionState.Closed)
connection.Open();
var reader = command.ExecuteReader();
while (reader.Read())
{
messages.Add(item: new Messages { MessageID = (int)reader["MessageID"], Message = (string)reader["Message"], EmptyMessage = reader["EmptyMessage"] != DBNull.Value ? (string) reader["EmptyMessage"] : "", MessageDate = Convert.ToDateTime(reader["Date"]) });
}
}
}
return messages;
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if (e.Type == SqlNotificationType.Change)
{
MessagesHub.SendMessages();
}
}
}
}
index.chtml
@{
ViewBag.Title = "Home Page";
}
<div class="row">
<div class="col-md-12">
<div id="messagesTable"></div>
</div>
</div>
@section Scripts{
<script src="~/Scripts/jquery.signalR-2.4.0.js"></script>
<script src="/signalr/hubs"></script>
<script type="text/javascript">
$(function () {
var Notifications = $.connection.messagesHub;
Notifications.client.updateMessages = function () {
getAllMessages()
//alert('Updated!')
};
//
$.connection.hub.start().done(function () {
getAllMessages();
console.log('connected--started')
}).fail(function (e) {
alert(e);
});
});
function getAllMessages() {
var tbl = $('#messagesTable');
$.ajax({
url: '/home/GetMessages',
contentType: 'application/html ; charset:utf-8',
type: 'GET',
async: true,
dataType: 'html'
}).success(function (result) {
tbl.empty().append(result);
console.log('result......');
return true
}).error(function () {
alert('ERROR!')
});
}
</script>
}
startup.cs
using Microsoft.AspNet.SignalR;
using Microsoft.Owin;
using Owin;
using System.Configuration;
[assembly: OwinStartupAttribute(typeof(SignalRDbUpdates.Startup))]
namespace SignalRDbUpdates
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
string connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
app.MapSignalR();
}
}
}
Global.asax
namespace SignalRDbUpdates
{
public class MvcApplication : System.Web.HttpApplication
{
string connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
GlobalConfiguration.Configure(WebApiConfig.Register);
//SqlDependency.Start(connString);
SqlDependency.Start(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
}
protected void Application_End()
{
//SqlDependency.Stop(connString);
SqlDependency.Stop(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
}
}
}