Как получить информацию об ошибке при HttpWebRequest.Метод GetResponse() завершается неудачей
я инициирую HttpWebRequest, а затем извлекаю его ответ. Иногда я получаю ошибку 500 (или, по крайней мере, 5##), но без описания. Я контролирую обе конечные точки и хотел бы, чтобы получающая сторона получила немного больше информации. Например, я хотел бы передать сообщение от сервера к клиенту. Возможно ли это с помощью HttpWebRequest и HttpWebResponse?
код:
try
{
HttpWebRequest webRequest = HttpWebRequest.Create(URL) as HttpWebRequest;
webRequest.Method = WebRequestMethods.Http.Get;
webRequest.Credentials = new NetworkCredential(Username, Password);
webRequest.ContentType = "application/x-www-form-urlencoded";
using(HttpWebResponse response = webRequest.GetResponse() as HttpWebResponse)
{
if(response.StatusCode == HttpStatusCode.OK)
{
// Do stuff with response.GetResponseStream();
}
}
}
catch(Exception ex)
{
ShowError(ex);
// if the server returns a 500 error than the webRequest.GetResponse() method
// throws an exception and all I get is "The remote server returned an error: (500)."
}
любая помощь в этом будет много оцененный.
4 ответов
возможно ли это с помощью HttpWebRequest и HttpWebResponse?
у вас может быть ваш веб-сервер просто поймать и записать текст исключения в тело ответа, а затем установить код состояния 500. Теперь клиент будет выдавать исключение при обнаружении ошибки 500, но вы можете прочитать поток ответов и получить сообщение об исключении.
Так что вы могли бы поймать исключения webexception что будет брошено, если не 200 код состояния возвращается с сервера и читается его тело:
catch (WebException ex)
{
using (var stream = ex.Response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
Console.WriteLine(reader.ReadToEnd());
}
}
catch (Exception ex)
{
// Something more serious happened
// like for example you don't have network access
// we cannot talk about a server exception here as
// the server probably was never reached
}
я столкнулся с этим вопросом при попытке проверить, существует ли файл на FTP-сайте или нет. Если файл не существует, будет ошибка при попытке проверить свою метку. Но я хочу убедиться, что ошибка не является чем-то другим, проверив ее тип.
на Response
свойство on WebException
будет типа FtpWebResponse
на котором вы можете проверить свои StatusCode
свойство видеть какая ошибка FTP у вас есть.
вот код, который я закончил с:
public static bool FileExists(string host, string username, string password, string filename)
{
// create FTP request
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + host + "/" + filename);
request.Credentials = new NetworkCredential(username, password);
// we want to get date stamp - to see if the file exists
request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
try
{
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
var lastModified = response.LastModified;
// if we get the last modified date then the file exists
return true;
}
catch (WebException ex)
{
var ftpResponse = (FtpWebResponse)ex.Response;
// if the status code is 'file unavailable' then the file doesn't exist
// may be different depending upon FTP server software
if (ftpResponse.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
{
return false;
}
// some other error - like maybe internet is down
throw;
}
}
я столкнулся с подобной ситуацией:
Я пытался прочитать необработанный ответ в случае ошибки HTTP, потребляющей службу SOAP, используя BasicHTTPBinding.
однако при чтении ответа с помощью GetResponseStream()
, получил ошибку:
поток не читается
Итак, этот код работал для меня:
try
{
response = basicHTTPBindingClient.CallOperation(request);
}
catch (ProtocolException exception)
{
var webException = exception.InnerException as WebException;
var rawResponse = string.Empty;
var alreadyClosedStream = webException.Response.GetResponseStream() as MemoryStream;
using (var brandNewStream = new MemoryStream(alreadyClosedStream.ToArray()))
using (var reader = new StreamReader(brandNewStream))
rawResponse = reader.ReadToEnd();
}
HttpWebRequest myHttprequest = null;
HttpWebResponse myHttpresponse = null;
myHttpRequest = (HttpWebRequest)WebRequest.Create(URL);
myHttpRequest.Method = "POST";
myHttpRequest.ContentType = "application/x-www-form-urlencoded";
myHttpRequest.ContentLength = urinfo.Length;
StreamWriter writer = new StreamWriter(myHttprequest.GetRequestStream());
writer.Write(urinfo);
writer.Close();
myHttpresponse = (HttpWebResponse)myHttpRequest.GetResponse();
if (myHttpresponse.StatusCode == HttpStatusCode.OK)
{
//Perform necessary action based on response
}
myHttpresponse.Close();