У нас была похожая задача в моей компании, и мы выяснили, что оптимальным решением было использование асинхронных триггеров с внешним активатором, который вызывает веб-сервисы из .NET и удаляет сообщения из очереди после успешного вызова.Это означает, что вы создаете обычный триггер базы данных, который отправляет сообщение в очередь компонента Service Broker для асинхронной обработки.АКА Асинхронный триггер.Вот пример из главы 10 книги Клауса
-- Create the trigger written with T-SQL
CREATE TRIGGER OnCustomerInserted ON Customers FOR INSERT
AS
DECLARE @conversationHandle UNIQUEIDENTIFIER
DECLARE @fromService SYSNAME
DECLARE @toService SYSNAME
DECLARE @onContract SYSNAME
DECLARE @messageBody XML
SET @fromService = 'CustomerInsertedClient'
SET @toService = 'CustomerInsertedService'
SET @onContract = 'http://ssb.csharp.at/SSB_Book/c10/CustomerInsertContract'
-- Check if there is already an ongoing conversation with the TargetService
SELECT @conversationHandle = ConversationHandle FROM SessionConversations
WHERE SPID = @@SPID
AND FromService = @fromService
AND ToService = @toService
AND OnContract = @onContract
IF @conversationHandle IS NULL
BEGIN
-- We have to begin a new Service Broker conversation with the TargetService
BEGIN DIALOG CONVERSATION @conversationHandle
FROM SERVICE @fromService
TO SERVICE @toService
ON CONTRACT @onContract
WITH ENCRYPTION = OFF;
-- Create the dialog timer for ending the ongoing conversation
BEGIN CONVERSATION TIMER (@conversationHandle) TIMEOUT = 5;
-- Store the ongoing conversation for further use
INSERT INTO SessionConversations (SPID, FromService, ToService, OnContract, ConversationHandle)
VALUES
(
@@SPID,
@fromService,
@toService,
@onContract,
@conversationHandle
)
END
-- Construct the request message
SET @messageBody = (SELECT * FROM INSERTED FOR XML AUTO, ELEMENTS);
-- Send the message to the TargetService
;SEND ON CONVERSATION @conversationHandle
MESSAGE TYPE [http://ssb.csharp.at/SSB_Book/c10/CustomerInsertedRequestMessage] (@messageBody);
Вместо использования хранимых процедур, которые будут вызывать веб-сервисы через управляемый код (внутренняя активация), мы решили, что лучше разгрузить эту обработку вне сервера SQL,И нашел этот симпатичный маленький инструмент, созданный Microsoft - Внешний активатор , который прослушивает очередь активации и запускает приложение, когда в очереди появляется новое сообщение.Для реализации, пожалуйста, обратитесь к главе 4 Клауса в книге.