8 Stimmen

Service Broker und Webdienste

Ich möchte eine gespeicherte Prozedur (innerhalb einer Service-Broker-Infrastruktur) implementieren, die einen Webdienst aufruft. Ich habe mir einige Beispiele aus dem Buch von Aschenbrenner über Service Broker angesehen. Allerdings finde ich keine mit einem Webservice-Aufruf. Kann mir jemand helfen?

Danke Sqlbs

4voto

Sergey Punkte 3124

Wir hatten eine ähnliche Aufgabe in meinem Unternehmen und fanden heraus, dass eine optimale Lösung darin bestand, asynchrone Trigger mit einem externen Aktivator zu verwenden, der Webservices von .NET aufruft und Nachrichten nach erfolgreichem Aufruf aus der Warteschlange entfernt. Das bedeutet, dass Sie einen regulären Datenbanktrigger erstellen, der eine Nachricht an die Warteschlange des Servicebrokers zur asynchronen Verarbeitung sendet. AKA Asynchronous Trigger. Hier ist ein Beispiel aus dem Kapitel 10 von Klause's Buch

-- 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);

Anstatt gespeicherte Prozeduren zu verwenden, die Webdienste über verwalteten Code aufrufen würden (interne Aktivierung), haben wir beschlossen, dass es besser ist, diese Verarbeitung außerhalb des SQL-Servers zu verlagern. Und fanden dieses nette kleine Tool, das von Microsoft entwickelt wurde - Externer Aktivator die die Aktivierungswarteschlange abhört und eine Anwendung startet, wenn eine neue Nachricht in der Warteschlange steht. Zur Implementierung lesen Sie bitte Klaus' Kapitel 4 in diesem Buch.

0voto

Jānis Punkte 2146

Ich würde Windows-Dienst, der am Ende der Service-Broker (und rufen Sie Web-Service wie in jedem win app) ist zu machen. Irgendwie glaube nicht, Aufruf Webdienst von db ist nette Idee.

kann einen externen Aktivator finden aquí . und laden Sie die Service-Broker-Schnittstelle/externen Aktivator herunter aquí . Service Broker-Schnittstelle ist einfach großartig! einfach zu bedienen.

-1voto

Pawel Marciniak Punkte 2166

Siehe das erste Beispiel in Kapitel 10. Wenn sich Ihre Frage auf Details der Implementierung von Webdienstaufrufen bezieht, kennzeichnen Sie die Frage bitte mit den entsprechenden Webdienst-Tags und nicht mit Service Broker.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X