2010-08-03 157 views
6

我想实现调用Web服务的存储过程(在服务代理基础设施内)。我从Aschenbrenner关于Service Broker的书中找到了一些例子。但是,我没有找到任何与Web服务调用。谁能帮忙?服务代理和Web服务

感谢 Sqlbs

回答

0

参见第10章的第一个例子。如果你的问题是关于实现Web服务调用的详细信息,请标记与适当的Web服务标签,而不是服务代理的问题。

+0

嗨, 谢谢您的笔记。 我看了一下这个例子。它涉及在服务代理基础结构内调用Web服务。我真正需要的是这样的: 行插入/更新到表 - >插入/更新触发器触发 - >触发器写入消息到服务代理队列 - >存储过程由SQL Server激活 - >存储过程调用Web服务 - >谈话结束。任何想法? Sqlbs – user409679 2010-08-24 13:57:55

0

我会做窗口服务是在服务代理的结束(和调用Web服务作为赢得任何应用程序)。不知何故,不认为从数据库调用Web服务是个好主意。

可以找到AOUT外部激活here。并下载服务代理界面/外部激活器here。服务代理界面非常棒!使用方便。

4

我们在我的公司也有类似的任务,想出了一个最佳的解决方案是使用与成功的电话后称,从.NET和去队列中的消息web服务的外部激活异步触发器。这些措施是您创建常规数据库触发器,以便将消息发送到服务代理队列进行异步处理。 AKA异步触发器。这里是从Klause的书

-- 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服务的第10章的样本。并发现微软创建的这个漂亮的小工具 - External Activator ,它将侦听激活队列并在队列中有新消息时启动应用程序。有关实现,请参阅本书中克劳斯的第4章。