2010-11-04 14 views
16

Ich habe eine aspx-Seite mit starkem Verkehr, die bei jeder Benutzeranforderung wie folgt einen Webdienst aufruft.500 interner Serverfehler bei GetResponse()

string uri = "Path.asmx"; 
string soap = "soap xml string"; 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
request.Headers.Add("SOAPAction", "\"http://xxxxxx""); 
request.ContentType = "text/xml;charset=\"utf-8\""; 
request.Accept = "text/xml"; 
request.Method = "POST"; 

using (Stream stm = request.GetRequestStream()) 
{ 
    using (StreamWriter stmw = new StreamWriter(stm)) 
    { 
     stmw.Write(soap); 
    } 
} 
WebResponse response = request.GetResponse(); 
response.close(); 

Alles funktioniert gut, aber manchmal bekomme ich den folgenden Fehler.

Der Remote-Server hat einen Fehler zurückgegeben: (500) Interner Serverfehler. bei System.Net.HttpWebRequest.GetResponse()

Hat jemand eine Idee über diesen Fehler oder kann mir jemand sagen, wenn ich falsch mache.

Danke

+3

Wenn es manchmal funktioniert und nicht andere, müssen Sie die Seife xml eines Fehlers posten. Da stimmt etwas nicht, nicht im Code. –

Antwort

4

Schließlich werde ich interne Server Fehlermeldung mit dem folgenden Code los. Nicht sicher, ob es einen anderen Weg gibt, um es zu erreichen.


string uri = "Path.asmx"; 
string soap = "soap xml string"; 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
request.Headers.Add("SOAPAction", "\"http://xxxxxx""); 
request.ContentType = "text/xml;charset=\"utf-8\""; 
request.Accept = "text/xml"; 
request.Method = "POST"; 

using (Stream stm = request.GetRequestStream()) 
{ 
    using (StreamWriter stmw = new StreamWriter(stm)) 
    { 
     stmw.Write(soap); 
    } 
} 
 using (WebResponse webResponse = request.GetResponse()) { }  
+0

Verwendung ist versuchen-endlich {dispose}. Eine gute Möglichkeit, die Ausnahme loszuwerden, besteht darin, sie mit try-catch zu ignorieren.Ha-ha –

18

Von diesem Fehler, würde ich sagen, dass Ihr Code ist in Ordnung, zumindest der Teil, der den Webservice aufruft. Der Fehler scheint in dem tatsächlichen Webdienst zu sein.

Um den Fehler vom Webserver zu erhalten, fügen Sie einen Versuch Catch und fangen Sie eine WebException. Eine WebException hat eine Eigenschaft namens Response, die eine HttpResponse ist. Sie können dann alles, was zurückgegeben wird, protokollieren und den Code hochladen. Überprüfen Sie später in den Protokollen und sehen Sie, was tatsächlich zurückgegeben wird.

5

Haben Sie versucht, UserAgent für Ihre Anfrage anzugeben? Zum Beispiel:

request.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"; 
+1

Fehlender UserAgent verursacht bei vielen Websites mit dynamischen Inhalten einen Fehler. Guter Rat beim Schreiben eines Scraper, sollte aber nicht mit SOAP oder REST API benötigt werden. –

28

Für mich ist dieser Fehler aufgetreten ist, weil ich 2 Web-API Aktionen hatte, die genau die gleichen Unterschriften hatte und beide die gleichen Verben hatte, HttpPost, was ich tat, war eine der Verben ändern (die man verwendet, für die Aktualisierung) zu PUT und der Fehler wurde entfernt. Die folgende in meiner catch-Anweisung dazu beigetragen, an die Wurzel des Problems in immer:

catch (WebException webex) 
{ 
       WebResponse errResp = webex.Response; 
       using (Stream respStream = errResp.GetResponseStream()) 
       { 
        StreamReader reader = new StreamReader(respStream); 
        string text = reader.ReadToEnd(); 
       } 
} 
+1

Dies ist nicht gut dokumentiert und es dauert ewig, bis ich es gefunden habe. Danke für das Beispiel! – b729sefc

+0

Gefunden das sehr hilfreich. Überlegen Sie, ob Sie Folgendes ändern möchten, wenn Sie beabsichtigen, es zu behalten, oder die Ausgabe von teamcity oder einer CI-Box lesen müssen. catch (WebException webException) { WebResponse webResponse = webException.Response; Verwendung (Stream response = webResponse.GetResponseStream()) { if (Response == null) { throw; } StreamReader Reader = neuer StreamReader (responseStream); Zeichenfolge text = reader.ReadToEnd(); werfen neue WebException (text, webException); } } –

+0

Vielen Dank! sehr geschätzt – Nobody

0

bei der Fehlermeldung suchen zunächst einmal möchte ich Sie vorschlagen, um Ihre gesamte Anwendung neu kompilieren, stellen Sie sicher, dass alle erforderlichen DLL-Dateien gibt es in bin-Ordner, wenn Sie es neu kompilieren.

0

In meinem Fall wurde mein Anfrageobjekt vom Basisobjekt geerbt. Ohne wissentlich habe ich eine Eigenschaft mit int hinzugefügt? in meinem Request-Objekt und mein Basisobjekt hat auch die gleiche Eigenschaft (gleicher Name) mit Int-Datentyp. Ich bemerkte dies und löschte die Eigenschaft, die ich im Anfrageobjekt hinzugefügt hatte und danach funktionierte es gut.

0

Für mich war der Fehler irreführend. Ich habe den wahren Fehler entdeckt, indem ich den fehlerhaften Web-Service mit SoapUI getestet habe.

+0

... und festgestellt, dass das war ..? – SteveCav

+1

SteveCav: Der wahre Fehler könnte fast alles sein: Der Punkt ist, dass das Testen mit SoapUI die REAL-Fehlermeldung ergab und nicht den bedeutungslosen "internen Serverfehler". –

0

In meinem Fall entferne ich nur die SoapAction Anweisung aus dem HttpWebRequest Objekt. Also definiere ich nicht .Headers.Add("SOAPAction","someurl") in HttpWebRequest Definitionen und mein Code funktioniert gut.

ResultXML ist ein XDocument. ResultString ist eine Zeichenfolge.

try 
{ 
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url); 
    //req.Headers.Add("SOAPAction", "http://tempuri.org/IWebService/GetMessage"); 
    req.ProtocolVersion = HttpVersion.Version11; 
    req.ContentType = "text/xml;charset=\"utf-8\""; 
    req.Accept = "text/xml"; 
    req.KeepAlive = true; 
    req.Method = "POST";   

    using (Stream stm = req.GetRequestStream()) 
    { 
     using (StreamWriter stmw = new StreamWriter(stm)) 
      stmw.Write(soapStr); 
    } 
    using (StreamReader responseReader = new StreamReader(req.GetResponse().GetResponseStream())) 
    { 
     string result = responseReader.ReadToEnd(); 
     ResultXML = XDocument.Parse(result); 
     ResultString = result;  
    } 
} 
Verwandte Themen