Service Broker和Web服务

时间:2010-08-03 14:06:20

标签: service service-broker

我想实现一个调用Web服务的存储过程(在服务代理infrasturture中)。我查看了Aschenbrenner关于Service Broker的书中的一些例子。但是,我找不到任何Web服务调用。有人可以帮忙吗?

由于 Sqlbs

3 个答案:

答案 0 :(得分:4)

我们公司也有类似的任务,并找出一个最佳的解决方案是使用异步触发器和外部激活器,它从.NET调用webservices并在成功调用后对消息进行排队。您可以创建一个常规数据库触发器,该触发器将消息发送到服务代理队列以进行异步处理。 AKA异步触发器。这是Klause的书第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 server之外卸载该处理,而不是使用通过托管代码调用Web服务的存储过程(内部激活)。并发现了微软创建的这个漂亮的小工具 - External Activator 当队列中有新消息时,它将侦听激活队列并启动应用程序。有关实施,请参阅书中的克劳斯第4章。

答案 1 :(得分:0)

请参阅第10章中的第一个示例。如果您的问题是关于实施Web服务调用的详细信息,请使用适当的Web服务标记而不是服务代理标记问题。

答案 2 :(得分:0)

我会在服务经纪人的最后制作Windows服务(并在任何获胜应用程序中调用Web服务)。不知何故不认为从db调用Web服务是个好主意。

可以找到一个外部激活器here。并下载服务代理接口/外部激活器here。服务代理界面真棒!易于使用。