Estou iniciando um HttpWebRequest e, em seguida, recuperando sua resposta. Ocasionalmente, recebo um erro 500 (ou pelo menos 5 ##), mas nenhuma descrição. Tenho controle sobre os dois terminais e gostaria que o terminal receptor recebesse mais informações. Por exemplo, gostaria de passar a mensagem de exceção do servidor para o cliente. Isso é possível usando HttpWebRequest e HttpWebResponse?
Código:
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)."
}
Qualquer ajuda com isso seria muito apreciada.
fonte
GetRequestStream
eGetResponse
pode lançar exceções ?Me deparei com essa pergunta ao tentar verificar se um arquivo existe em um site FTP ou não. Se o arquivo não existir, ocorrerá um erro ao tentar verificar seu carimbo de data / hora. Mas quero ter certeza de que o erro não é outra coisa, verificando seu tipo.
A
Response
propriedade emWebException
será do tipoFtpWebResponse
em que você pode verificar suaStatusCode
propriedade para ver qual erro de FTP você tem.Este é o código que terminei com:
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; } }
fonte
Eu enfrentei uma situação semelhante:
Eu estava tentando ler a resposta bruta no caso de um erro HTTP consumindo um serviço SOAP, usando BasicHTTPBinding.
No entanto, ao ler a resposta usando
GetResponseStream()
, obteve o erro:Então, este código funcionou para mim:
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(); }
fonte
Você também pode usar esta biblioteca que envolve HttpWebRequest e Response em métodos simples que retornam objetos com base nos resultados. Ele usa algumas das técnicas descritas nessas respostas e tem muito código inspirado nas respostas deste e de tópicos semelhantes. Ele captura automaticamente quaisquer exceções, busca abstrair o máximo possível de código padrão para fazer essas solicitações da web e desserializa automaticamente o objeto de resposta.
Um exemplo de como seu código ficaria usando este wrapper é tão simples quanto
var response = httpClient.Get<SomeResponseObject>(request); if(response.StatusCode == HttpStatusCode.OK) { //do something with the response console.Writeline(response.Body.Id); //where the body param matches the object you pass in as an anonymous type. }else { //do something with the error console.Writelint(string.Format("{0}: {1}", response.StatusCode.ToString(), response.ErrorMessage); }
Divulgação completa Esta biblioteca é uma biblioteca wrapper de código aberto e gratuita, e eu sou o autor da referida biblioteca. Não ganho dinheiro com isso, mas acho que é imensamente útil ao longo dos anos e tenho certeza de que qualquer pessoa que ainda usa as classes HttpWebRequest / HttpWebResponse também o fará.
Não é uma solução mágica, mas oferece suporte para obter, postar e excluir com async e não async para get e post, bem como solicitações e respostas JSON ou XML. Ele está sendo mantido ativamente a partir de 21/06/2020
fonte
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();
fonte