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. Я заметил это и удалил свойство, которое я добавил в объект запроса, и после этого он работал нормально.