Ich habe folgenden Code:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "HEAD";
request.Credentials = MyCredentialCache;
try
{
request.GetResponse();
}
catch
{
}
Wie kann ich einen bestimmten 404-Fehler abfangen? Der WebExceptionStatus.ProtocolError kann nur erkennen, dass ein Fehler aufgetreten ist, gibt jedoch nicht den genauen Code des Fehlers an.
Beispielsweise:
catch (WebException ex)
{
if (ex.Status != WebExceptionStatus.ProtocolError)
{
throw ex;
}
}
Ist einfach nicht sinnvoll genug ... die Protokollausnahme könnte 401, 503, 403 sein, eigentlich alles.
Verwenden Sie die HttpStatusCode Enumeration
, speziell HttpStatusCode.NotFound
So etwas wie:
HttpWebResponse errorResponse = we.Response as HttpWebResponse;
if (errorResponse.StatusCode == HttpStatusCode.NotFound) {
//
}
Woherwe
ist ein WebException
.
try
{
var request = WebRequest.Create(uri);
using (var response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
// Process the stream
}
}
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError &&
ex.Response != null)
{
var resp = (HttpWebResponse) ex.Response;
if (resp.StatusCode == HttpStatusCode.NotFound)
{
// Do something
}
else
{
// Do something else
}
}
else
{
// Do something else
}
}
In C # 6 können Sie Ausnahmefilter verwenden.
try
{
var request = WebRequest.Create(uri);
using (var response = request.GetResponse())
using (var responseStream = response.GetResponseStream())
{
// Process the stream
}
}
catch(WebException ex) when ((ex.Response as HttpWebResponse)?.StatusCode == HttpStatusCode.NotFound)
{
// handle 404 exceptions
}
catch (WebException ex)
{
// handle other web exceptions
}
Ich habe das noch nicht getestet, aber es sollte funktionieren
try
{
// TODO: Make request.
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError) {
HttpWebResponse resp = ex.Response as HttpWebResponse;
if (resp != null && resp.StatusCode == HttpStatusCode.NotFound)
{
// TODO: Handle 404 error.
}
else
throw;
}
else
throw;
}
Ich denke, wenn Sie eine WebException abfangen, gibt es einige Informationen, anhand derer Sie feststellen können, ob es sich um eine 404 handelt. Das ist der einzige Weg, den ich im Moment kenne ... Ich wäre interessiert andere zu kennen ...
catch(WebException e) {
if(e.Status == WebExceptionStatus.ProtocolError) {
var statusCode = (HttpWebResponse)e.Response).StatusCode);
var description = (HttpWebResponse)e.Response).StatusDescription);
}
}
Für VB.NET-Benutzer, die hier surfen, können wir die Ausnahme meines Erachtens nur dann abfangen, wenn es sich tatsächlich um einen 404 handelt.
Try
httpWebrequest.GetResponse()
Catch we As WebException When we.Response IsNot Nothing _
AndAlso TypeOf we.Response Is HttpWebResponse _
AndAlso (DirectCast(we.Response, HttpWebResponse).StatusCode = HttpStatusCode.NotFound)
' ...
End Try
Siehe unter MSDN zum Status der Antwort:
...
catch(WebException e) {
Console.WriteLine("The following error occured : {0}",e.Status);
}
...
Fangen Sie den richtigen Ausnahmetyp ab WebException
:
try
{
var request = (HttpWebRequest) WebRequest.Create(String.Format("http://www.gravatar.com/avatar/{0}?d=404", hashe));
using(var response = (HttpWebResponse)request.GetResponse())
Response.Write("has avatar");
}
catch(WebException e)
{
if(e.Response.StatusCode == 404)
Response.Write("No avatar");
}
Schauen Sie sich diesen Ausschnitt an. Die GetResponse löst eine WebRequestException aus. Fangen Sie das ein und Sie können den Statuscode aus der Antwort abrufen.
try {
// Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name.
HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create("invalid site");
// Get the associated response for the above request.
HttpWebResponse myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse();
myHttpWebResponse.Close();
}
catch(WebException e) {
Console.WriteLine("This program is expected to throw WebException on successful run."+
"\n\nException Message :" + e.Message);
if(e.Status == WebExceptionStatus.ProtocolError) {
Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode);
Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription);
}
}
catch(Exception e) {
Console.WriteLine(e.Message);
}
dies kam von http://msdn.Microsoft.com/en-us/library/system.net.webexception.status.aspx
Wenn POST oder GET data to the server using WebRequest class, dann wäre der Typ der Ausnahme WebException.Below ist der Code für die Datei nicht gefunden Ausnahme
//Create a web request with the specified URL
string path = @"http://localhost/test.xml1";
WebRequest myWebRequest = WebRequest.Create(path);
//Senda a web request and wait for response.
try
{
WebResponse objwebResponse = myWebRequest.GetResponse();
Stream stream= objwebResponse.GetResponseStream();
}
catch (WebException ex) {
if (((HttpWebResponse)(ex.Response)).StatusCode == HttpStatusCode.NotFound) {
throw new FileNotFoundException(ex.Message);
}
}