簡體   English   中英

GetResponse()上500內部服務器錯誤

[英]500 internal server error at GetResponse()

我有一個繁重的流量aspx頁面根據每個用戶的請求調用Web服務,如下所示。

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

有沒有人對這個錯誤有任何想法,或者有人告訴我,如果我做錯了。

對我來說,這個錯誤發生是因為我有2個Web 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();
                }
}

從那個錯誤,我會說你的代碼很好,至少是調用webservice的部分。 該錯誤似乎在實際的Web服務中。

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

您是否嘗試為您的請求指定UserAgent? 例如:

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

最后,我用以下代碼擺脫了內部服務器錯誤消息。 不確定是否有其他方法可以實現它。


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()) { } 

首先查看您的錯誤消息我建議您重新編譯整個應用程序,確保在重新編譯時所有必需的dll都在bin文件夾中。

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

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

在我的例子中,我只是從HttpWebRequest對象中刪除SoapAction指令。 所以,我沒有在HttpWebRequest定義中定義.Headers.Add("SOAPAction","someurl") ,我的代碼運行正常。

ResultXML是一個XDocument ResultString是一個字符串。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM