Столкнувшись с той же проблемой и найдя те же ответы в Интернете без какой-либо помощи, я повторно изучил ответ недействительной подписки xml от профилировщика.
Я нашел пример на сайте поддержки msdn с немного другим порядком кода. Когда я попробовал это, я понял проблему - не открывайте свой объект соединения, пока вы не создадите объект команды и объект зависимости кэша. Вот порядок, которому вы должны следовать, и все будет хорошо:
- Обязательно включите уведомления (SqlCahceDependencyAdmin) и запустите SqlDependency.Start first
- Создать объект подключения
- Создайте объект команды и назначьте текст команды, тип и объект соединения (любая комбинация конструкторов, свойства настроек или использование CreateCommand).
- Создание объекта зависимости sql-кэша
- Открыть объект подключения
- Выполнить запрос
- Добавление элемента в кэш с использованием зависимости.
Если вы следуете этому порядку и соблюдаете все другие требования в своем утверждении select, у вас нет проблем с разрешениями, это будет работать!
Я полагаю, что проблема связана с тем, как .NET Framework управляет соединением, в частности с настройками. Я попытался переопределить это в моем тесте команды sql, но он никогда не работал. Это только предположение - я знаю, что изменение порядка немедленно решило проблему.
Я смог собрать его из следующих сообщений в сообщения MSDN.
Эта публикация была одной из наиболее распространенных причин недействительной подписки и показывает, как клиент .Net устанавливает свойства, которые отличаются от того, что требуется для уведомления.
https://social.msdn.microsoft.com/Forums/en-US/cf3853f3-0ea1-41b9-987e-9922e5766066/changing-default-set-options-forced-by-net?forum=adodotnetdataproviders
Тогда это сообщение было от пользователя, который, как и я, сократил свой код до самого простого формата. Мой оригинальный шаблон кода был похож на его.
https://social.technet.microsoft.com/Forums/windows/en-US/5a29d49b-8c2c-4fe8-b8de-d632a3f60f68/subscriptions-always-invalid-usual-suspects-checked-no-joy?forum=sqlservicebroker
Тогда я нашел этот пост, тоже очень простое решение проблемы, только его проблема была простой - требовалось имя из 2 частей для таблиц. В его случае предложение решило проблему. Посмотрев его код, я заметил, что основным отличием было ожидание открытия объекта подключения, пока ПОСЛЕ команды объекта И объект зависимости не были созданы. Мое единственное предположение скрыто (я еще не запустил рефлектор для проверки, поэтому только предположение), объект Соединения открывается по-другому, или порядок событий и команды происходят по-разному из-за этой ассоциации.
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/bc9ca094-a989-4403-82c6-7f608ed462ce/sql-server-not-creating-subscription-for-simple-select-query-when-using-sqlcachedependency?forum=sqlservicebroker
Надеюсь, это поможет кому-то еще в аналогичной проблеме.