Сервис-брокер и веб-сервисы - PullRequest
6 голосов
/ 03 августа 2010

Я хочу реализовать хранимую процедуру (в инфраструктуре брокера служб), которая вызывает веб-службу.Я посмотрел несколько примеров из книги Ашенбреннера о Service Broker.Однако я не нахожу ничего с вызовом веб-службы.Может ли кто-нибудь помочь?

Спасибо Sqlbs

Ответы [ 3 ]

4 голосов
/ 22 июня 2012

У нас была похожая задача в моей компании, и мы выяснили, что оптимальным решением было использование асинхронных триггеров с внешним активатором, который вызывает веб-сервисы из .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 Клауса в книге.

0 голосов
/ 24 января 2012

Я бы сделал Windows-сервис, который находится в конце сервисного брокера (и вызывал бы веб-сервис, как в любом приложении win). Почему-то не думаю, что вызов веб-службы из db - хорошая идея.

можно найти вне внешнего активатора здесь . и скачать интерфейс брокера услуг / внешний активатор здесь . Интерфейс сервисного брокера просто великолепен! прост в использовании.

0 голосов
/ 12 августа 2010

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

...