Если вы действительно не имеете никакого контроля над сервером (то есть вы не можете использовать задание sql, запланированное задание или установить сервер Windows), тогда вы можете использовать System.Threading.Timer , который вы инициализируйте в вашем Global.asax (например, при запуске приложения), который вызывает определенный метод в вашем приложении каждые x минут. Затем этот метод будет запрашивать вашу базу данных и видеть, какие уведомления нужно отправлять.
Хотя это действительно нежелательный подход, поскольку, как я знаю, не всегда гарантируется, что таймер всегда будет вызывать, поскольку, как говорит Питер, ваше веб-приложение не всегда будет работать.
Однако, в зависимости от ваших требований, это может быть подход «достаточно хорошим», если у вас нет других вариантов.