Übersicht über das WCF-Dienstmodell mit dem SAP-Adapter
Wenn Sie Vorgänge nutzen, die der Microsoft BizTalk-Adapter für mySAP Business Suite-Oberflächen verwendet, fungiert Ihr Code entweder als Client oder als Dienst für den Adapter.
Ihr Code fungiert als Client, um die folgenden Arten von Vorgängen auf dem SAP-System aufzurufen:
Rufen Sie einen Remotefunktionsaufruf (RFC) auf.
Rufen Sie einen transaktionsgesteuerten Remotefunktionsaufruf (tRFC) auf.
Rufen Sie eine Business Application Programming Interface (BAPI) auf.
Senden eines Zwischendokuments (IDOC)
Ihr Code fungiert als Dienst, um die folgenden Arten von Vorgängen zu empfangen:
Empfangen eines RFC-Servers (RFC-Server)
Empfangen eines tRFC (tRFC-Servers)
Erhalten Sie ein IDOC.
Hinweis
Da BAPIs Methoden sind, die vom SAP-System für Geschäftsobjekte verfügbar gemacht werden, die sich im Business Object Repository (BOR) befinden, können Sie keine BAPIs empfangen.
Im Windows Communication Foundation-Dienstmodell (WCF) wird der Dienstvertrag, der zwischen einem Client und einem Dienst besteht, als .NET-Schnittstelle dargestellt, und Vorgänge werden als Methoden auf dieser Schnittstelle dargestellt. Der SAP-Adapter und WCF stellen Tools bereit, mit denen Sie diese Schnittstelle für zielorientierte Vorgänge aus den Metadaten generieren können, die der Adapter verfügbar macht. Diese Tools erstellen auch eine WCF-Clientklasse, die zum Aufrufen der Vorgänge verwendet werden kann, die in der Dienstschnittstelle verfügbar gemacht werden. Eine Clientanwendung kann die Methoden der WCF-Clientklasse aufrufen, um Vorgänge für den Adapter aufzurufen. Um einen Dienst zum Empfangen von Vorgängen vom SAP-Adapter zu implementieren, implementieren Sie die für den Zielvorgang generierte Schnittstelle.
In den folgenden Abschnitten wird erläutert, wie Sie mithilfe des WCF-Dienstmodells Client- und Dienstcode für den SAP-Adapter erstellen.
Erstellen eines WCF-Clients und Aufrufen von Vorgängen in SAP
Um das WCF-Dienstmodell zum Aufrufen von Vorgängen auf dem SAP-Adapter zu verwenden, müssen Sie zunächst eine WCF-Clientklasse für die Zielvorgänge generieren. Anschließend können Sie einen instance dieser Klasse, einen WCF-Client, erstellen und dessen Methoden aufrufen, um Vorgänge auf dem SAP-System auszuführen.
So rufen Sie Vorgänge für den SAP-Adapter auf
Generieren Sie eine WCF-Clientklasse und Hilfscode. Verwenden Sie das Visual Studio-Plug-In Add Adapter Service Reference oder das ServiceModel Metadata Utility Tool (svcutil.exe), um eine WCF-Clientklasse für die SAP-Systemartefakte zu generieren, mit denen Sie arbeiten möchten. Weitere Informationen zum Generieren eines WCF-Clients finden Sie unter Generieren eines WCF-Clients oder eines WCF-Dienstvertrags für SAP-Lösungsartefakte.
Erstellen Sie einen WCF-Client instance, indem Sie eine Clientbindung angeben. Das Angeben einer Clientbindung umfasst das Angeben der Bindung und Endpunktadresse, die der WCF-Client verwendet. Sie können dies entweder imperativ im Code oder deklarativ in der Konfiguration tun. Weitere Informationen zum Angeben einer Clientbindung finden Sie unter Konfigurieren einer Clientbindung für das SAP-System. Der folgende Code erstellt einen WCF-Client, der zum Aufrufen eines RFC im SAP-System verwendet werden kann. Außerdem werden die Anmeldeinformationen für das SAP-System festgelegt. Der WCF-Client wird über die Konfiguration initialisiert.
RfcClient rfcClient = new RfcClient("SAPBinding_Rfc"); rfcClient.ClientCredentials.UserName.UserName = "YourUserName"; rfcClient.ClientCredentials.UserName.Password = "YourPassword";
Öffnen Sie den WCF-Client.
rfcClient.Open();
Rufen Sie Methoden auf dem WCF-Client auf, der in Schritt 2 erstellt wurde, um Vorgänge auf dem SAP-System auszuführen. Der folgende Code ruft die SD_RFC_CUSTOMER_GET-Methode des WCF-Clients auf, um den RFC im SAP-System aufzurufen.
microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST[] customers = new microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST[0]; rfcClient.SD_RFC_CUSTOMER_GET(string.Empty, "AB*", ref customers);
Schließen Sie den WCF-Client.
rfcClient.Close();
Erstellen und Implementieren eines WCF-Diensts mithilfe des SAP-Adapters
Um das WCF-Dienstmodell zum Empfangen von Vorgängen vom SAP-Adapter zu verwenden, müssen Sie zuerst die .NET-Schnittstelle (auch WCF-Dienstvertrag genannt) generieren, die den Dienstvertrag darstellt, der vom SAP-Adapter für den Vorgang verfügbar gemacht wird. Weitere Informationen dazu finden Sie unter Generieren eines WCF-Clients oder eines WCF-Dienstvertrags für SAP-Lösungsartefakte.
Anschließend implementieren Sie einen WCF-Dienst, indem Sie die generierte Schnittstelle implementieren. Diese Klasse enthält die Geschäftslogik, um den Vorgang zu verarbeiten und eine Antwort an den Adapter zurückzugeben. Anschließend verwenden Sie einen Diensthost (System.ServiceModel.ServiceHost), um eine instance dieses Diensts zu hosten.
So erstellen und implementieren Sie einen WCF-Dienst
Generieren Sie einen WCF-Dienstvertrag und Hilfsklassen. Verwenden Sie das Add Adapter Service Reference Plug-In oder svcutil.exe, um einen WCF-Dienstvertrag (Schnittstelle) für die SAP-Systemartefakte zu generieren, mit denen Sie arbeiten möchten. Weitere Informationen zum Generieren eines WCF-Clients finden Sie unter Generieren eines WCF-Clients oder eines WCF-Dienstvertrags für SAP-Lösungsartefakte.
Implementieren Sie einen WCF-Dienst aus der In Schritt 1 generierten Schnittstellen- und Hilfsklassen. Wenn bei der Verarbeitung der Daten für den Vorgang ein Fehler auftritt, kann die Methode, die diesen Vorgang verarbeitet, eine Ausnahme auslösen, um einen Fehler an das SAP-System zurückzugeben. Andernfalls muss die Methode einen instance der entsprechenden (generierten) Antwortklasse für den Vorgang zurückgeben. Sie müssen die WCF-Dienstklasse wie folgt zuordnen:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
Wenn Sie das Add Adapter Service Reference Plug-In zum Generieren der Schnittstelle verwendet haben, können Sie Ihre Logik direkt in der entsprechenden Methode in der generierten SAPBindingService-Klasse implementieren. Diese Klasse finden Sie in SAPBindingService.cs. Die folgenden Codeunterklassen der SAPBindingService-Klasse .
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,UseSynchronizationContext = false)] class RfcServerClass : SAPBindingNamespace.SAPBindingService { public override Z_RFC_MKD_ADDResponse Z_RFC_MKD_ADD(Z_RFC_MKD_ADDRequest request) { // If either parameter is null throw an exception if (request.X == null || request.Y == null) throw new System.ArgumentNullException(); // Add the two operands int result = (int) (request.X + request.Y); return new Z_RFC_MKD_ADDResponse(result); } }
Wenn Sie zum Generieren der Schnittstelle svcutil.exe verwendet haben, müssen Sie eine Klasse erstellen, die die Schnittstelle implementiert und Ihre Logik in der entsprechenden Methode dieser Klasse implementiert.
Erstellen Sie eine instance des WCF-Diensts, der in Schritt 2 erstellt wurde.
// create service instance RfcServerClass rfcServerInstance = new RfcServerClass();
Erstellen Sie eine instance von System.ServiceModel.ServiceHost mithilfe des WCF-Diensts und eines Basisverbindungs-URI. Der Basisverbindungs-URI darf keine userinfoparams oder einen query_string enthalten.
// Enable service host Uri[] baseUri = new Uri[] { new Uri("sap://a/YourSAPHost/00") }; ServiceHost srvHost = new ServiceHost(pollingInstance, baseUri);
Erstellen Sie eine SAPBinding-Datei , und konfigurieren Sie sie für den Vorgang, indem Sie die Bindungseigenschaften festlegen. Sie können dies entweder explizit im Code oder deklarativ in der Konfiguration tun. Mindestens müssen Sie AcceptCredentialsInUri auf true festlegen.
// Create and configure a binding for the service endpoint. NOTE: binding // parameters are set here for clarity, but these are already set in the // the generated configuration file SAPBinding binding = new SAPBinding(); // The credentials are included in the connection URI, so set this property to true binding.AcceptCredentialsInUri = true;
Fügen Sie dem Diensthost einen Dienstendpunkt hinzu. Gehen Sie dazu folgendermaßen vor:
Verwenden Sie die in Schritt 5 erstellte Bindung.
Geben Sie einen Verbindungs-URI an, der Anmeldeinformationen enthält und eine Listenerverbindung (SAP-Gateway, Gatewaydienst und Programm-ID) im query_string angibt. Weitere Informationen zum SAP-Verbindungs-URI finden Sie unter Erstellen des SAP-Systemverbindungs-URI.
Geben Sie den Dienstvertrag an. Dies ist der Name der Schnittstelle, die den WCF-Dienstvertrag darstellt. Für RFCs ist es "Rfc".
// Add service endpoint // NOTE: The contract for the service endpoint is "Rfc". // This is the generated WCF service contract (interface) -- see SAPBindingInterface.cs. Uri serviceUri = new Uri("sap://User=YourUserName;Passwd=YourPassword;Client=800;Lang=EN;@a/YourSAPHost/00?ListenerGwServ=SAPGW00&ListenerGwHost=YourSapHost&ListenerProgramId=SAPAdapter"); srvHost.AddServiceEndpoint("Rfc", binding, serviceUri);
Um den Vorgang vom SAP-System zu empfangen, öffnen Sie den Diensthost. Ihr WCF-Dienst wird immer dann aufgerufen, wenn das SAP-System den Vorgang für die Programm-ID und das System aufruft, die im Dienst-URI in Schritt 6 angegeben sind.
// Open the service host to begin receiving the operation. srvHost.Open();
Um den Empfang des Vorgangs zu beenden, schließen Sie den Diensthost.
Wichtig
Der Adapter empfängt den Vorgang weiterhin, bis der Diensthost geschlossen wird. Sie sollten den Diensthost immer schließen, wenn Sie den Vorgang nicht mehr erhalten möchten.
srvHost.Close();
Weitere Informationen
Entwickeln von SAP-Anwendungen mithilfe des WCF-Dienstmodells