Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

HTTP status 502: Bad Gateway

Îåêßíçóå áðü ôï ìÝëïò evagelos. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 30-04-2013, 13:43. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  29-04-2013, 15:59 72531

    HTTP status 502: Bad Gateway

    Γεια σας,

    Προσπαθώ να κανω asynchronous post ένα αρχείο xml.

    Όπως παρακολουθώ από το web service monitor, τα παραστατικά καταχωρούνται κανονικά αλλά όταν τελειώσει το asynchronous call τότε μου γυρίζει μήνυμα λάθους  «The request failed with HTTP status 502: Bad Gateway».

    Ολα αυτά γίνονται σε winForm εφαρμογή που καλεί το webservice του Atlantis ERP

    Αν μπορείτε να με βοηθήσετε που βρίσκεται το λάθος

    Ο κώδικά μου είναι ο παρακάτω:

     

     [code]

     

            private void async_CreateData(string n)

            {

                _canBeClosed = false;

               string myFile = File.ReadAllText(n);

                atlwebsrv.IAtlantisservice atl = new atlwebsrv.IAtlantisservice();

                atl.Url = url;

                atl.XMLActionCompleted += new atlwebsrv.XMLActionCompletedEventHandler(atl_XMLActionCompleted);

                atl.XMLActionAsync(myFile);

            }

     

        void atl_XMLActionCompleted(object sender, atlwebsrv.XMLActionCompletedEventArgs e)

            {

                try

                {

                    String _responce = e.Result;

                    if (IsValidXml(_responce) == false)

                    {

                        MessageBox.Show(_responce, "Λάθος", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);

                    }

                    else

                    {

                                        MessageBox.Show("Ολα ΟΚ", "ΟΚ");

                                    }

                        }

                catch (Exception ex)

                {

                    MessageBox.Show(ex.ToString());

                }

                    }

    [/code]

     

     

     

  •  30-04-2013, 08:18 72533 σε απάντηση της 72531

    Απ: HTTP status 502: Bad Gateway

    Το 502 (και όλα τα HTTP status) έχουν να κάνουν με την ίδια την κλήση, όχι με το αν είναι async ή όχι. Εξάλλου, η κλήση που κάνεις ΔΕΝ είναι async. Είναι μία σύγχρονη κλήση σε μία κλάση η οποία σηκώνει και ένα event.

    To 502 σημαίνει συνήθως ότι έχεις χρησιμοποιήσει λάθος proxy ή default gateway στα IP settings. Αν δεις τον ορισμό του 502, στο επιστρέφει το proxy αν λάβει μπούρδες από τον server στον οποίο προσπαθούσες να μιλήσεις. Είναι π.χ. ένα πρόβλημα που εμφανίζεται συχνά στα starbucks όταν ξαφνικά λήγει η σύνδεση σου και πρέπει να ξαναδώσεις κωδικό. Το ότι είναι 5xx μάλιστα σημαίνει ότι το μήνυμα το έστειλε ο server ή ο proxy που βρίσκεται ενδιάμεσα και σου λέει ότι το πρόβλημα βρίσκεται στον server. 

    Στην περίπτωση που το μήνυμα το έστειλε ο server, θα πρέπει να ελέγξεις μήπως το συγκεκριμένο web service επιστρέφει αυτό τον κωδικό για κάποιο λόγο.

    Ο κώδικας που δίνεις δεν λέει τίποτε δυστυχώς καθώς το πρόβλημα έχει να κάνει με τις διευθύνσεις που χρησιμοποιείς και τα πιθανά proxy settings. Για να αντιμετωπίσεις τέτοια προβλήματα θα πρέπει να χρησιμοποιήσεις κάποιο εργαλείο όπως το Fiddler για να δεις πού πραγματικά γίνονται οι κλήσεις και τί περιέχουν.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  30-04-2013, 12:16 72534 σε απάντηση της 72533

    Απ: HTTP status 502: Bad Gateway

    για αρχή, έχω την εντύπωση ότι είναι async γιατί sync θα ήταν κάπως έτσι:

            private string sync_CreateData(string n)
            {
                string myFile = File.ReadAllText(n);
                atlwebsrv.IAtlantisservice atl = new atlwebsrv.IAtlantisservice();
                atl.Url = url;
                atl.Timeout = timeout;
                string responce = atl.XMLAction(myFile);
                return responce;
            } 

     

    επίσης μιλάμε για τεστ που γίνετε σε ΕΣΩΤΕΡΙΚΟ δικτυο, αρα no proxy.

    Ο "server" έχει static IP και ο client dymamic, αν αυτό εννοείς.

    το πλήρες μηνυμα λάθους που πέρνω είναι αυτό:

    System.Reflection.TargetInvocationException: An exception occurred during the operation, making the result invalid.  Check InnerException for exception details. ---> System.Net.WebException: The request failed with HTTP status 502: Bad Gateway.
       at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
       at System.Web.Services.Protocols.SoapHttpClientProtocol.InvokeAsyncCallback(IAsyncResult result)
       --- End of inner exception stack trace ---
       at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()
       at salesman.atlwebsrv.XMLActionCompletedEventArgs.get_Result() in C:\sc\power\salesman\WindowsFormsApplication7\Web References\atlwebsrv\Reference.cs:line 218
       at salesman.demoExport.atl_XMLActionCompleted(Object sender, XMLActionCompletedEventArgs e) in C:\sc\power\salesman\WindowsFormsApplication7\demoExport.cs:line 128

     

    Πάντος έβαλα αυτό και δείχνει να παίζει:

    atl.Proxy = WebRequest.GetSystemWebProxy();

     

  •  30-04-2013, 13:43 72535 σε απάντηση της 72534

    Απ: HTTP status 502: Bad Gateway

    Το αν είναι async ή όχι δεν έχει να κάνει κάτι με το ότι ο server επέστρεψε 502. Ή έχει πρόβλημα, ή γυρίζει μπούρδες status code για άσχετο λάθος. Αν για παράδειγμα έχει πρόβλημα με τα δεδομένα που στέλνεις, θα έπρεπε να στείλει 400 (Bad Request). Θα πρέπει να βάλεις το Fiddler για να δεις τι στέλνεται και τι επιστρέφεται από το server. Εναλλακτικά, μπορείς να ενεργοποιήσεις το network logging του .net όπως περιγράφεται στο Enabling System.Net logging για να δεις τι συμβαίνει. Νομίζω ότι το Fiddler είναι πολύ ευκολότερο στη χρήση.

    Επειδή τώρα η πιθανότητα ο server μπούρδες status δεν είναι απίθανη, θα πρότεινα να κάνεις την κλήση και σύγχρονα και με τους δύο τρόπους. Αν ο ένας από τους δύο αποτυγχάνει, σύγκρινε τι καταγράφει ο Fiddler για να δεις αν υπάρχει διαφορά στο τι στέλνει στη μία και στην άλλη περίπτωση. Αν δεις διαφορά, κάτι δεν πάει καλά με την "ασύγχρονη" μέθοδο.

    Επιπλέον, το όνομα της μεθόδου, XMLAction, είναι ΠΟΛΥ ΥΠΟΠΤΟ. Ένα web service "τυλίγει" μία κλήση σε XML, δεν απαιτεί να του δώσεις εσύ έτοιμο το XML. Αν το XMLAction απαιτεί να φορτώσεις και να στείλεις ένα σωστό XML, μπορεί το πρόβλημα να είναι ότι το αρχείο που στέλνεις δεν είναι σωστό XML, ή ότι έχει λάθος encoding (π.χ. διαβάζεις ASCII αρχείο με ελληνικά). Κάνε μία δοκιμή με ένα καρφωτό XML string σε αυτή την περίπτωση για να διαπιστώσεις αν το πρόβλημα είναι το encoding.

    Εγκυκλοπαιδικά και για να ξεκαθαρίσουμε, όταν λέμε async εννοούμε ότι χρησιμοποιείται κάποιος από τους μηχανισμούς του .NET για ασύγχρονη κλήση: async/await, TPL, Begin/EndInvoke. Οτιδήποτε άλλο είναι custom implementation της συγκεκριμένης κλάσης. Ένα συχνό pattern παλιότερα ήταν να ξεκινάς μία κλήση και να περιμένεις ένα event, όπως φαίνεται ότι κάνει η συγκεκριμένη κλάση.

    Αν κρίνω από το exception stack trace, η XMLActionAsync ξεκινάει μία κλήση με BeginΧΧΧ (για να πάρει το IAsyncResult που φαίνεται στη γραμμή 3) και περνάει ένα callback το οποίο θα σηκώσει το κατάλληλο event όταν κληθεί.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems