mohamad_ali Ответов: 1

Как запустить sqldepndency со строкой подключения daynamic в ASP.NET MVC 5


I have some databases that work with single ASP.NET MVC project and all of the databases are the same and i used real time alarm with signalr but when i want to start sqldependencyin Application_Start method needed connection string, i set company name to cookie when user want to login and pass cookie to Application_Start to know which sqldependencyin which database started . but Application_Start run for first user,then for another user in another database i cant start sqldependency, and cookie is null in this method. please help


Что я уже пробовал:

protected void Application_Start(object sender, EventArgs e)
   {
       SqlConnectionString = ConfigurationManager.ConnectionStrings[HttpContext.Current.Request.Cookies["zone"].Value.ToString()].ConnectionString;

       if (!String.IsNullOrEmpty(SqlConnectionString))
           {
               if (SqlConnectionString.ToLower().StartsWith("metadata") && SqlConnectionString != null)
               {
                   System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder efbeulder = new System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder(SqlConnectionString);

                   SqlConnectionString = efbeulder.ProviderConnectionString;

                   SqlDependency.Start(SqlConnectionString);
               }

           }

   }

1 Ответов

Рейтинг:
6

Richard Deeming

Как следует из названия, Application_Start событие срабатывает при запуске приложения. Он не запускается снова, пока приложение не будет перезапущено.

Он также потенциально будет работать до любой пользователь вошел в систему, а это значит, что у вас не будет значения файла cookie.

Согласно с документация[^], вы можете смело звонить SqlDependency.Start несколько раз для одного и того же соединения, и только один прослушиватель будет запускаться для каждой строки соединения. Таким образом, самое простое решение - переместить ваш код в Application_BeginRequest событие вместо этого:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    // Make sure we have a cookie value:
    var cookie = HttpContext.Current.Request.Cookies["zone"];
    if (cookie == null || string.IsNullOrEmpty(cookie.Value)) return;
    
    // Make sure the connection string exists:
    var connectionStringSetting = WebConfigurationManager.ConnectionStrings[cookie.Value];
    if (connectionStringSetting == null) return;
    
    // Make sure the connection string has a value:
    string sqlConnectionString = connectionStringSetting.ConnectionString;
    if (string.IsNullOrEmpty(sqlConnectionString)) return;
    
    // Turn an Entity Framework connection string into a SQL connection string:
    if (sqlConnectionString.StartsWith("metadata", StringComparison.OrdinalIgnoreCase))
    {
        var efBuilder = new System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder(sqlConnectionString);
        sqlConnectionString = efBuilder.ProviderConnectionString;
    }
    
    // Start the SQL dependency:
    SqlDependency.Start(sqlConnectionString);
}


mohamad_ali

Thnx для вашего ответа, а когда я хочу остановить sqldepndency?
могу ли я сделать это в методе begin request?
сначала остановись а потом начинай

Richard Deeming

Почему вы хотите остановить его, а затем немедленно начать снова? К чему это приведет?

mohamad_ali

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

Richard Deeming

Согласно документации, если вы позвоните Start несколько раз с одной и той же строкой подключения он будет запускать прослушиватель для этого соединения только один раз. Последующие звонки будут возвращены false чтобы указать, что прослушиватель для этого соединения уже запущен.

Richard Deeming

Если это новый вопрос, то лучше его задать. опубликуйте его как новый вопрос[^] чтобы другие получили возможность увидеть это и помочь.

Maciej Los

5ed!