Freigeben über


Erstellen eines Kanals mithilfe des SQL-Adapters

Im WCF-Kanalmodell rufen Sie Vorgänge für die SQL Server-Datenbank auf und empfangen die Ergebnisse, indem Sie SOAP-Nachrichten mit dem Microsoft BizTalk-Adapter für SQL Server über einen WCF-Kanal austauschen.

  • Sie rufen ausgehende Vorgänge auf, indem Sie entweder einen IRequestChannel oder einen IOutputChannel verwenden, um Nachrichten an den Adapter zu senden.

  • Sie erhalten Nachrichten für eingehende Vorgänge, indem Sie Nachrichten über einen IInputChannel für Polling-, TypedPolling- oder Benachrichtigungsvorgänge empfangen.

    Die Prozeduren in diesem Thema enthalten Informationen zum Erstellen und Konfigurieren von Kanalformen, die für eingehende und ausgehende Vorgänge verwendet werden.

Erstellen ausgehender Kanäle (Clientkanäle)

Sie können entweder einen IRequestChannel oder einen IOutputChannel verwenden, um Vorgänge für die SQL Server-Datenbank aufzurufen. In beiden Fällen erstellen Sie zunächst eine System.ServiceModel.ChannelFactory mithilfe der entsprechenden Schnittstelle. Anschließend verwenden Sie die Factory, um den Kanal zu erstellen. Nachdem Sie den Kanal erstellt haben, können Sie ihn verwenden, um Vorgänge für den Adapter aufzurufen.

So erstellen und öffnen Sie einen ausgehenden Kanal

  1. Erstellen und initialisieren Sie eine instance von ChannelFactory für die gewünschte Kanalform, indem Sie einen Endpunkt und eine Bindung verwenden. Der Endpunkt gibt einen SQL Server Verbindungs-URI an, und die Bindung ist eine instance von sqlBinding.

  2. Geben Sie mithilfe der Credentials-Eigenschaft SQL Server Anmeldeinformationen für die Kanalfactory an.

  3. Öffnen Sie die Kanalfactory.

  4. Rufen Sie eine instance des Kanals ab, indem Sie die CreateChannel-Methode in der Kanalfactory aufrufen.

  5. Öffnen Sie den Kanal.

    Sie können die Bindungs- und Endpunktadresse in Ihrem Code oder aus der Konfiguration angeben.

Angeben der Bindungs- und Endpunktadresse im Code

Im folgenden Codebeispiel wird gezeigt, wie Sie einen IRequestChannel erstellen, indem Sie die Bindungs- und Endpunktadresse im Code angeben. Der Code zum Erstellen eines IOutputChannel ist identisch, mit dem Unterschied, dass Sie eine IOutputChannel-Schnittstelle für die ChannelFactory und den Kanaltyp angeben müssen.

// Create binding -- set binding properties before you open the factory.  
SqlAdapterBinding sdbBinding = new SqlAdapterBinding();  
  
// Create address.  
EndpointAddress sdbAddress = new EndpointAddress("mssql://<sql_server_name>//<database_name>?");  
  
// Create channel factory from binding and address.  
ChannelFactory<IRequestChannel> factory =   
    new ChannelFactory<IRequestChannel>(sdbBinding, sdbAddress);  
  
// Specify credentials.   
factory.Credentials.UserName.UserName = "myuser";  
factory.Credentials.UserName.Password = "mypassword";  
  
// Open factory  
factory.Open();  
  
// Get channel and open it.  
IRequestChannel channel = factory.CreateChannel();  
channel.Open();  

Angeben der Bindungs- und Endpunktadresse in der Konfiguration

Im folgenden Codebeispiel wird gezeigt, wie sie eine Kanalfactory aus einem Clientendpunkt erstellen, der in der Konfiguration angegeben ist.

// Create channel factory from configuration.  
ChannelFactory<IRequestChannel> factory =  
new ChannelFactory<IRequestChannel>("MyRequestChannel");  
  
// Specify credentials.  
factory.Credentials.UserName.UserName = "myuser";  
factory.Credentials.UserName.Password = "mypassword";  
  
// Open the factory.  
factory.Open();  
  
// Get a channel and open it.  
IRequestChannel channel = factory.CreateChannel();  
channel.Open();  

Die Konfigurationseinstellungen

Der folgende Code zeigt die Konfigurationseinstellungen, die für das vorherige Beispiel verwendet wurden. Der Vertrag für den Clientendpunkt muss "System.ServiceModel.Channels.IRequestChannel" oder "System.ServiceModel.Channels.IOutputChannel" lauten, je nachdem, welche Kanalform Sie erstellen möchten.

<?xml version="1.0" encoding="utf-8"?>  
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">  
    <system.serviceModel>  
        <bindings>  
            <sqlBinding>  
                <binding name="SqlAdapterBinding" closeTimeout="00:01:00" openTimeout="00:01:00"  
                    receiveTimeout="00:10:00" sendTimeout="00:01:00" maxConnectionPoolSize="100"  
                    encrypt="false" useAmbientTransaction="true" batchSize="20"  
                    polledDataAvailableStatement="" pollingStatement="" pollingIntervalInSeconds="30"  
                    pollWhileDataFound="false" notificationStatement="" notifyOnListenerStart="true"  
                    enableBizTalkCompatibilityMode="true" chunkSize="4194304"  
                    inboundOperationType="Polling" useDatabaseNameInXsdNamespace="false"  
                    allowIdentityInsert="false" enablePerformanceCounters="false"  
                    xmlStoredProcedureRootNodeName="" xmlStoredProcedureRootNodeNamespace="" />  
            </sqlBinding>  
        </bindings>  
        <client>  
            <endpoint address="mssql://mysqlserver//mydatabase?" binding="sqlBinding"  
                bindingConfiguration="SqlAdapterBinding" contract="System.ServiceModel.Channels.IRequestChannel"  
                name="MyRequestChannel" />  
        </client>  
    </system.serviceModel>  
</configuration>  

Erstellen eingehender Kanäle (Dienst)

Sie konfigurieren den SQL-Adapter zum Abfragen der SQL Server Datenbanktabellen und -ansichten, indem Sie Bindungseigenschaften für eine instance von sqlBinding festlegen. Anschließend verwenden Sie diese Bindung, um einen Kanallistener zu erstellen, über den Sie einen IInputChannel-Kanal abrufen können, um den Polling-, TypedPolling- oder Benachrichtigungsvorgang vom Adapter zu empfangen.

So erstellen und öffnen Sie einen IInputChannel zum Empfangen eingehender Vorgänge

  1. Erstellen Sie eine instance von SQLBinding.

  2. Legen Sie die bindungseigenschaften fest, die für den eingehenden Vorgang erforderlich sind. Für einen Abfragevorgang müssen Sie beispielsweise mindestens die Bindungseigenschaften InboundOperationType, PolledDataAvailableStatement und PollingStatement festlegen, um den SQL-Adapter zum Abfragen der SQL Server Datenbank zu konfigurieren.

  3. Erstellen Sie einen Kanallistener, indem Sie die BuildChannelListener<IInputChannel-Methode> für sqlBinding aufrufen. Sie geben den SQL Server Verbindungs-URI als einen der Parameter für diese Methode an.

  4. Öffnen Sie den Listener.

  5. Rufen Sie einen IInputChannel-Kanal ab, indem Sie die AcceptChannel-Methode im Listener aufrufen.

  6. Öffnen Sie den Kanal.

    Der folgende Code zeigt, wie Sie einen Kanallistener erstellen und einen IInputChannel abrufen, um datenveränderte Nachrichten vom Adapter zu empfangen.

Wichtig

Der SQL-Adapter unterstützt nur den unidirektionalen Empfang. Daher müssen Sie IInputChannel verwenden, um Nachrichten für eingehende Vorgänge von SQL Server zu empfangen.

// Create a binding: specify the InboundOperationType, the PolledDataAvailableStatement, and   
// the PollingStatement binding properties.  
SqlAdapterBinding binding = new SqlAdapterBinding();  
binding.InboundOperationType = InboundOperation.Polling;  
binding.PolledDataAvailableStatement = "SELECT COUNT (*) FROM EMPLOYEE";  
binding.PollingStatement = "SELECT * FROM Employee;EXEC MOVE_EMP_DATA;EXEC ADD_EMP_DETAILS John, Tester, 100000";  
  
// Create a binding parameter collection and set the credentials  
ClientCredentials credentials = new ClientCredentials();  
credentials.UserName.UserName = "myuser";  
credentials.UserName.Password = "mypassword";  
  
BindingParameterCollection bindingParams = new BindingParameterCollection();  
bindingParams.Add(credentials);  
  
// Get a listener from the binding and open it.  
Uri connectionUri = new Uri("mssql://mysqlserver//mydatabase?");  
IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel>(connectionUri, bindingParams);  
listener.Open();  
  
// Get a channel from the listener and open it.  
IInputChannel channel = listener.AcceptChannel();  
channel.Open();  

Weitere Informationen

Entwickeln von Anwendungen mithilfe des WCF-Kanalmodells