500 внутренняя ошибка сервера в GetResponse()

У меня есть страница с интенсивным трафиком aspx, вызывающая веб-сервис по запросу каждого пользователя следующим образом.

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

Кто-нибудь имеет представление об этой ошибке или кто-нибудь может сказать мне, если я делаю неправильно.

8 ответов

Решение

Наконец я избавляюсь от внутреннего сообщения об ошибке сервера с помощью следующего кода. Не уверен, есть ли другой способ добиться этого.


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

Для меня эта ошибка произошла, потому что у меня было 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();
                }
}

От этой ошибки я бы сказал, что ваш код в порядке, по крайней мере, та часть, которая вызывает веб-сервис. Ошибка, кажется, в реальном веб-сервисе.

Чтобы получить ошибку от веб-сервера, добавьте try catch и перехватите исключение WebException. У WebException есть свойство Response, которое является HttpResponse. затем вы можете записать в журнал все, что возвращается, и загрузить свой код. Проверьте позже в журналах и посмотрите, что на самом деле возвращается.

Вы пытались указать UserAgent для вашего запроса? Например:

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

Для меня ошибка была обманчива. Я обнаружил истинную ошибку, протестировав ошибочный веб-сервис с SoapUI.

В первую очередь, глядя на ваше сообщение об ошибке, я бы посоветовал вам перекомпилировать все приложение, убедитесь, что все необходимые библиотеки находятся в папке bin, когда вы перекомпилируете его.

В моем случае я просто удаляю SoapAction инструкция от HttpWebRequest объект. Итак, я не определяю .Headers.Add("SOAPAction","someurl") в HttpWebRequest определения и мой код работает нормально.

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

В моем случае мой объект запроса унаследован от базового объекта. Не зря я добавил свойство с int? в моем запросе объект и мой базовый объект также имеют одно и то же свойство (то же имя) с типом данных int. Я заметил это и удалил свойство, которое я добавил в объект запроса, и после этого он работал нормально.

Другие вопросы по тегам