Мне нужно реализовать SqlCacheDependency для таблицы, которая будет зависеть от этого запроса:
SELECT Nickname FROM dbo.[User]
.
Я создал метод для этой цели:
private IEnumerable<string> GetNicknamesFromCache()
{
const String cacheValueName = "Nicknames";
var result = HttpRuntime.Cache.Get(cacheValueName) as List<String>;
if (result == null)
{
result = _repository.GetAllNicknames();
var connectionString = ConfigurationManager.ConnectionStrings["RepositoryContext"].ConnectionString;
var sqlConnection = new SqlConnection(connectionString);
var sqlCommand = new SqlCommand("SELECT Nickname FROM dbo.[User]", sqlConnection);
var sqlDependency = new SqlCacheDependency(sqlCommand);
HttpRuntime.Cache.Insert(cacheValueName, result, sqlDependency);
}
return result;
}
Но когда я запускаю свое приложение, оно не работает.
Я проверил список подписчиков (sys.dm_qn_subscriptions
table) и не было записей.
Я исследовал много времени и уже пробовал различные решения, но они не работают для меня:
-
использовать доверенное соединение и установить некоторые разрешения для публичной роли:
GRANT CREATE PROCEDURE TO public
GRANT CREATE QUEUE TO public
GRANT CREATE SERVICE TO public
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO public
GRANT SELECT ON OBJECT::dbo.[User] TO public
GRANT RECEIVE ON QueryNotificationErrorsQueue TO public
-
использовать 'sa' для подключения
- используйте aspnet_regsql.exe(
aspnet_regsql.exe -S localhost -E -ed -d TestTable -et -t User
) -
добавить конфигурацию в system.webServer в web.config:
<caching>
<sqlCacheDependency enabled="true">
<databases>
<add name="Tmpl" pollTime="5000" connectionStringName="RepositoryContext"/>
</databases>
</sqlCacheDependency>
</caching>
-
поместите SqlDependency.Start() в событие Global.asax Application_Start
-
выполняется в разных экземплярах SQL Server (SQL Server 2008 Express, SQL Server 2008)
Но это не помогло. Это все еще не работает.
Как мне заставить работать?