2010-08-03 156 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章。