example data create c# httpwebrequest httpwebresponse

data - webrequest stream c#



Cómo obtener información de error cuando HttpWebRequest.GetResponse() falla (4)

Estoy iniciando un HttpWebRequest y luego estoy recuperando su respuesta. Ocasionalmente, obtengo un error de 500 (o al menos 5 ##), pero ninguna descripción. Tengo control sobre ambos puntos finales y me gustaría que el extremo receptor obtenga un poco más de información. Por ejemplo, me gustaría pasar el mensaje de excepción del servidor al cliente. ¿Es esto posible usando HttpWebRequest y 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)." }

Cualquier ayuda con esto sería muy apreciada.


¿Es esto posible usando HttpWebRequest y HttpWebResponse?

Puede hacer que su servidor web simplemente capture y escriba el texto de excepción en el cuerpo de la respuesta, luego establezca el código de estado en 500. Ahora el cliente lanzará una excepción cuando encuentre un error 500, pero puede leer la secuencia de respuesta y buscar Mensaje de la excepción.

Por lo tanto, puede capturar una WebException que es lo que se lanzará si el servidor devuelve un código de estado que no es 200 y lee su cuerpo:

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 }


Me encontré con esta pregunta al intentar verificar si un archivo existía en un sitio FTP o no. Si el archivo no existe, habrá un error al intentar verificar su marca de tiempo. Pero quiero asegurarme de que el error no sea otra cosa, al verificar su tipo.

La propiedad Response en WebException será del tipo FtpWebResponse en la que puede verificar su propiedad StatusCode para ver qué error de FTP tiene.

Aquí está el código con el que terminé:

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


Me enfrenté a una situación similar:

Estaba intentando leer la respuesta sin formato en caso de un error de HTTP que consumía un servicio SOAP, utilizando BasicHTTPBinding.

Sin embargo, al leer la respuesta utilizando GetResponseStream() , se produjo el error:

Transmisión no legible

Entonces, este código funcionó para mí:

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