2010-11-04 35 views
16

我有一個繁忙的流量aspx頁面在每個用戶的請求上調用Web服務,如下所示。GetResponse中的500內部服務器錯誤()

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(); 

一切工作正常,但有時我得到以下錯誤。

遠程服務器返回錯誤:(500)內部服務器錯誤。 在System.Net.HttpWebRequest.GetResponse()

有誰知道這個錯誤的任何想法或任何人可以告訴我,如果我做錯了。

謝謝

+3

如果它有時而不是其他,你需要張貼失敗的soap xml。有些東西是錯的,而不是在代碼中。 – 2010-11-04 16:55:19

回答

4

最後我用下面的代碼擺脫了內部服務器錯誤消息。不知道是否有另一種方式來實現它。


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

使用的是try-finally {dispose}。擺脫異常的好方法是用try-catch來忽略它。Ha-ha – 2017-09-13 05:30:03

18

從這個錯誤,我要說的是,你的代碼是好的,至少調用WebService的一部分。該錯誤似乎是在實際的Web服務中。

要從Web服務器獲取錯誤,請添加try catch並捕獲WebException。 WebException有一個名爲Response的屬性,它是一個HttpResponse。然後您可以記錄返回的任何內容,並上傳代碼。稍後在日誌中檢查並查看實際返回的內容。

5

您是否試圖爲您的請求指定UserAgent?例如:

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

缺少UserAgent會導致很多帶有動態內容的網站引發錯誤。編寫一個刮板時的好建議,但不應該用於SOAP或REST API。 – 2016-10-03 21:23:45

28

適合我,因爲我有2個是有相同特徵的網絡API操作兩者具有相同的動詞,HttpPost,我所做的是改變動詞的一個(使用了一個發生這種錯誤更新)到PUT並且錯誤已被刪除。在我的catch語句下面在得到了問題的根源幫助:

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

這沒有很好的記錄,它需要我永遠找到它。謝謝你的例子! – b729sefc 2014-06-06 18:37:18

+0

發現這非常有幫助。 如果您打算保留它或需要讀取teamcity或CI框中的輸出,請考慮更改爲以下內容。 (WebException webException) WebResponse webResponse = webException.Response; 使用(流responseStream = webResponse.GetResponseStream()) { if(responseStream == null) { throw; } StreamReader reader = new StreamReader(responseStream); String text = reader.ReadToEnd(); 拋出新的WebException(text,webException); } } – 2017-07-14 15:49:09

+0

謝謝!非常感謝 – Nobody 2017-08-23 20:56:07

0

看你的錯誤消息,首先我建議你重新編譯你的整個應用程序,確保所有必需的dll是否有bin文件夾,當你重新編譯它。

0

在我的情況下,我的請求對象從基礎對象繼承。不知道我用int添加了一個屬性?在我的請求對象和我的基礎對象也有int數據類型相同的屬性(同名)。我注意到這一點,並刪除了我在請求對象中添加的屬性,之後它工作正常。

0

對我來說,錯誤是誤導。通過使用SoapUI測試錯誤的Web服務,我發現了真正的錯誤。

+0

...發現是..? – SteveCav 2017-06-06 05:19:04

+1

SteveCav:真正的錯誤可能幾乎是任何東西:關鍵在於使用SoapUI進行測試時產生了REAL錯誤消息,而不是無意義的「內部服務器錯誤」。 – 2017-06-07 08:12:17

0

在我的情況下,我只是從HttpWebRequest對象中刪除SoapAction指令。所以,我沒有在HttpWebRequest定義中定義.Headers.Add("SOAPAction","someurl"),我的代碼工作正常。

ResultXMLXDocumentResultString是一個字符串。

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;  
    } 
}