SqlDependency Работает с локальной БД, но не с серверами - PullRequest
0 голосов
/ 07 января 2020

используя этот код:

 private async Task<object> ChatNotification()
        { 
            try
            {

                string cs =dbConnectionStr;

                using (SqlConnection con = new SqlConnection(cs))
                {
                    con.Open();
                    string cmdText = @"SELECT  
[dbo].[ChatMessage].[Id],
[dbo].[ChatMessage].[fkUserId],
[dbo].[ChatMessage].[fkGroupId],
[dbo].[ChatMessage].[Message],
[dbo].[ChatMessage].[DateTime],
[dbo].[ChatMessage].[IPAddress]  
FROM [dbo].[ChatMessage]  ";

                    SqlClientPermission permission =
                            new SqlClientPermission(
                            PermissionState.Unrestricted);
                    try
                    {
                        permission.Demand(); 
                    }
                    catch (System.Exception ex)
                    { 
                    }
                    using (SqlCommand cmd = new SqlCommand(cmdText, con))
                    {
                        cmd.Notification = null;


                        SqlDependency tradeInfoDependency = new SqlDependency(cmd);
                        tradeInfoDependency.OnChange += DependencyNotify_OnChange;
                        if (con.State == ConnectionState.Closed)
                        {
                            con.Open();
                        }

                        SqlDataReader reader = cmd.ExecuteReader();


                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
            return Ok( );
        }

// зависимость ******

private async void DependencyNotify_OnChange(object sender, SqlNotificationEventArgs e)
        {
            ChatNotification().Wait();
            var dependency = sender as SqlDependency;

            if (dependency == null) return;

            if (e.Info == SqlNotificationInfo.Insert || e.Info == SqlNotificationInfo.Merge)
            {
                var chats = _dbContext.ChatMessage.FromSql(@"SELECT * FROM [dbo].[ChatMessage] " +
                    "WHERE IsSeenByAdmin=0").OrderBy(c => c.DateTime).ToList();
                dependency.OnChange -= DependencyNotify_OnChange;
                await _chatAdminHubContext.Clients.All.SendAsync("AdminListen",
                 chats);

            }

        }


public Startup(IConfiguration configuration)
        {
            SqlDependency.Start(dbConnectionStr);
            Configuration = configuration;
}

все это работает с этой строкой подключения, которая подключена к моей локальной базе данных:

 private readonly string dbConnectionStr=
           "Data Source=.;Initial Catalog=signalr;Integrated Security=True;user id=sa;password=******";

, но это не работает, если я изменяю строку подключения следующим образом:

  private readonly string dbConnectionStr=
            "Data Source=server.*****.com\\MAININSTANCE;Initial Catalog=signalr;Persist Security Info=True;User ID=sa;Password=********";

я могу без проблем подключиться к серверу и локальной базе данных, и могу использовать выборку данных с С обеих сторон соединение установлено успешно, но единственная проблема заключается в том, что когда я вставляю строку в localdb [dbo]. [ChatMessage], зависимость работает, но когда я вставляю строку в серверы [dbo]. [ChatMessage], это не так.

Единственное, что я сделал, - включил брокера. Может ли это быть связано с какими-либо разрешениями на БД сервера?

ОБНОВЛЕНИЕ:

select * from sys.transmission_queue

дает этот параметр_передачи:

An exception occurred while enqueueing a message in the target queue. Error: 15517, State: 1. Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.    5
...