Announcement

Collapse
No announcement yet.

Hilfe bei .Net und SAP Web Service

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hilfe bei .Net und SAP Web Service

    Hallo Forum..
    ich hoffe hier kann mir jemand helfen.

    Hat jemand schon Erfahrung bzgl. der Entwicklung einer .Net ( C# ) Anwendung, die auf einen SAP Web Service zugreift!?
    Ich bekomme leider keine Daten von SAP zurück. Wenn ich in Visual Studio Breakpoints nach dem Web Service Aufruf setz, wird der nachfolgende Code (fett markiert) NICHT mehr ausgeführt - hat jemand eine erste Erklärung dafür!? Mache ich grundsätzlich was falsches!?

    Code:
                var binding = new BasicHttpBinding();
                binding.MaxReceivedMessageSize = int.MaxValue;
                binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
                binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
                var address = new EndpointAddress("http://server:port/sap/bc/srt/rfc/sap/WebService&wsdl"); 
    
    
                    ZAL_ENTRYSHEET_DELETEClient client = new ZAL_ENTRYSHEET_DELETEClient(binding, address);
                    client.ClientCredentials.UserName.UserName = "username";
                    client.ClientCredentials.UserName.Password = "password";
    
                    EntrysheetDeleteRequest request = new EntrysheetDeleteRequest();
                    request.Entrysheet = inputSheetNo.Text;
    
                    EntrysheetDeleteResponse response = await client.EntrysheetDeleteAsync(request);
    
                    Bapiret2 DeleteReturn = response.Return[0];
                    var _message = DeleteReturn.Message;
    
                    showListBlock.Text = _message;

    Danke für sämtliche Hilfen

  • #2
    Code wird nicht einfach nicht ausgeführt. Dir fehlt vermutlich ein Exception Handling. Also fang mal die Exception im Code un dsie dir an was da schief läuft.

    Comment


    • #3
      Wie sollte es aussehen?!? So: ?

      Code:
                  var binding = new BasicHttpBinding();
                  binding.MaxReceivedMessageSize = int.MaxValue;
                  binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
                  binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
                  var address = new EndpointAddress("http://server:port/sap/bc/srt/rfc/sap/ZAL_ENTRYSHEET_DELETE?wsdl");
      
                  try
                  {
                      ZAL_ENTRYSHEET_DELETEClient client = new ZAL_ENTRYSHEET_DELETEClient(binding, address);
                      client.ClientCredentials.UserName.UserName = "usernamer";
                      client.ClientCredentials.UserName.Password = "password";
      
                      EntrysheetDeleteRequest request = new EntrysheetDeleteRequest();
                      request.Entrysheet = inputSheetNo.Text;
      
                      EntrysheetDeleteResponse response = await client.EntrysheetDeleteAsync(request);
      
                      Bapiret2 DeleteReturn = response.Return[0];
                      var _message = DeleteReturn.Message;
      
                      showListBlock.Text = _message;
      
                  }
      
                  catch (Exception ex)
                  {
                      System.Diagnostics.Debug.WriteLine("Exception occured: " + ex.Message);
                  }
      Wie/ Wo kann ich es nachlesen!?

      Comment


      • #4
        Häh? Du hast den Code geschrieben du must doch wissen wo das hin geschrieben wird um es nachzulesen? Falls das hier ein schwerer Fall von Legoprogramming ist würde ich dir empfehlen nicht nur Code aus google in deinen Editor zu werfen, sondern bevor du ihn benutzt auch nachzulesen was der tut und versuchst ihn zu verstehen.

        Comment


        • #5
          Vom Grundsatz her ist dies ALLES nicht mein Code, sondern der meines Vorgängers. Die TRY CATCH Exception stand auch schon bei Themen-Eröffnung im Code - nur habe ich sie hier im Beitrag vorher ausgeschnitten (..was man auch am eingerückten Code sieht..)
          Kein Lego - aber google muss dann jetzt wohl folgen
          Trotzdem danke

          Comment


          • #6
            Dann hoffen wir mal dein Vorgänger hat einen Debug Listener geschrieben der die Ausgaben der Debug Klasse irgendwohin wegloggt(Ich bin davon ausgegangen das du das eigentlich gemacht hast). Sonst sind die ins Nirvana verschwunden oder du bekommst sie nur beim Debuggen im Output Fenster angezeigt(der ein Debug Listener ist).

            Comment


            • #7
              ..ich suche noch
              Aber es wird doch nur eine Exception geschrieben falls ein Fehler kommt, oder nicht!? Der Code wird ja ganz normal durchlaufen - es wird kein "richtiger" Fehler produziert.
              Code:
               EntrysheetDeleteResponse response = await client.EntrysheetDeleteAsync(request);
              habe ich mal einen Breakpoint gesetzt, der wird noch in VS angezeigt. Der nächste Breakpoint bei
              Code:
              Bapiret2 DeleteReturn = response.Return[0];
              wird übersprungen und der Code wird weiter bzw. wie gewünscht wieder durchgegeführt..

              Comment


              • #8
                aber _message wird zugewiesen?
                Dann kann ich mir nur vorstellen das Kompilat und Source Code nicht zusammenpassen.

                Comment


                • #9
                  Message ist ein Member in der Bapiret2-Klasse und die Zuweisung erfolgt durch var _message = DeleteReturn.Message; ....

                  Vllt was anderes: es ist ein asynchroner Web Service - folgt deswegen keine "direkte" Rückmeldung?

                  Comment


                  • #10
                    http://msdn.microsoft.com/de-de/library/aa480512.aspx
                    Christian

                    Comment


                    • #11
                      Message ist ein Member in der Bapiret2-Klasse und die Zuweisung erfolgt durch var _message = DeleteReturn.Message;
                      Ja Ja. Aber DeleteReturn ist das Ergebnis der Zeile davor von der du behauptest die wird nicht ausgeführt. Wenn die nicht ausgeführt wird wie kann das Ergebnis in der nächsten Zeile benutzt werden? Das macht keinen Sinn.

                      Vllt was anderes: es ist ein asynchroner Web Service - folgt deswegen keine "direkte" Rückmeldung?
                      Asynchron ja. Aber du wartest ja auf den Return durch das await.

                      Comment


                      • #12
                        So.. habe mich informiert und den Code - soweit ich das verstanden habe - asynchroniesiert

                        Wie/ Wo muss ich denn die Ausgabe des Return-Wertes in eine TextBox realisieren - haut das wegen async im GetData hin, oder muss ich das über eine Variable in den ClickEventHandler übergeben und dort ausführen!?

                        Code:
                                                private void DeleteSheet_Click(object sender, RoutedEventArgs e)
                                                {
                                                    LoadData();
                        
                                                    // TODO: hier? send results in TextBoxs
                        
                                                    // showListBlock.Text = _message;
                        
                                                }
                                
                                                async Task GetData()
                                                {
                                                    try
                                                    {                          
                                                        var binding = new BasicHttpBinding();
                                                        binding.MaxReceivedMessageSize = int.MaxValue;
                                                        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
                                                        binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
                                                        var address = new EndpointAddress("http://server:port/webservice");
                        
                                                        ZAL_ENTRYSHEET_DELETEClient client = new ZAL_ENTRYSHEET_DELETEClient(binding, address);
                                                        client.ClientCredentials.UserName.UserName = "UNAME";
                                                        client.ClientCredentials.UserName.Password = "PWORD";
                        
                                                        EntrysheetDeleteRequest request = new EntrysheetDeleteRequest();
                                                        request.Entrysheet = inputSheetNo.Text;
                        
                                                        EntrysheetDeleteResponse response = await client.EntrysheetDeleteAsync(request);
                                                            
                                                        Bapiret2 DeleteReturn = response.Return[0];
                                                        string _message = DeleteReturn.Message;
                                                    }
                        
                                                    catch (Exception ex)
                                                    {
                                                        System.Diagnostics.Debug.WriteLine("Exception occured: " + ex.Message);
                                                    }
                        
                                                }
                        
                                                public async void LoadData()
                                                {
                                                    await GetData();
                                                }

                        Comment


                        • #13
                          Jetzt ist es doppelt asynchron? Einmal hast du jetzt Getdata als Task und EntrysheetDeleteAsync selbst wird ja auch asynchron ausgeführt. Warum? Was soll das? Warum willst du das?

                          Comment


                          • #14
                            ja.. EntrySheetDeleteAsynch ist die Methode, die mir der Web Service zur Verfügung stellt - somit ist das async hier wohl zwingend notwendig.
                            Und entferne ich das async & await aus der LoadData(), sagt mir VisualStudio "Da auf diesen Aufruf nicht gewartet wird, wird die Ausführung der aktuellen Methode vor Abschluss des Aufrufs fortgesetzt. Ziehen Sie ein Anwenden des 'Await'-Operators auf das Ergebnis des Aufrufs in Betracht."

                            Wie hättest du es denn realisiert?

                            Comment


                            • #15
                              Meine Erfahrung in 4.5 sind da noch recht dünn um aus Erfahrungswerten heraus den richtigen Weg aufzeigen zu können noch dazu ohne die SAP API zu kennen. Vielleicht bewegt sich deren API in einer Ecke des Webservice Standards der nur eine Schnittmenge des WCF Standards darstellt. Dein Client ist doch durch WCF generiert? Wenn ich was gelernt habe ist das der gesamte Webservice Standard so weitläufig ist man mit den meisten Standardframeworks nur problemlos arbeiten kann wenn beide Enden Server und Client mit dem selben Framework erstellt wurden. Doof ist aber so. Ansonsten ist immer Handarbeit nötig um das soweit hinzu feilen das das passt.

                              In deinem Client sollte doch auch eine EntrySheetDelete Methode (also ohne Async) vorhanden sein oder? In der ganzen Betrachtung hier fehlt mir immer noch die Erklärung warum das asynchron laufen soll und das mittlerweile auf 2 Ebenen. Also einen synchronisierter asynchronen Aufruf der wiederum durch ein Threading gekapselt wird um ihn asynchron laufen zu lassen. Das sieht völlig sinnbefreit aus.

                              Comment

                              Working...
                              X