У меня есть следующий код:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "HEAD";
request.Credentials = MyCredentialCache;
try
{
request.GetResponse();
}
catch
{
}
Как я могу зафиксировать определенные 404 ошибки? WebExceptionStatus. ProtocolError может только обнаружить, что ошибка произошла, но не дают точный код ошибки.
Например:
catch (WebException ex)
{
if (ex.Status != WebExceptionStatus.ProtocolError)
{
throw ex;
}
}
Просто не достаточно полезно..., исключение протокола могло быть 401, 503, 403, что-либо действительно.
Используйте HttpStatusCode перечисление
, а именно HttpStatusCode.NotFound
Что-то вроде:
HttpWebResponse errorResponse = we.Response as HttpWebResponse;
if (errorResponse.StatusCode == HttpStatusCode.NotFound) {
//
}
Где
мы
является WebException
.
Зацените этот фрагмент. GetResponse бросит WebRequestException. Поймайте это и вы сможете получить код статуса из ответа.
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);
}
это пришло с http://msdn.microsoft.com/en-us/library/system.net.webexception.status.aspx
Я думаю, что если вы поймаете WebException, то там есть некоторая информация, которую вы можете использовать, чтобы определить, был ли это 404. Это единственный известный мне на данный момент способ... Мне было бы интересно узнать другие...
catch(WebException e) {
if(e.Status == WebExceptionStatus.ProtocolError) {
var statusCode = (HttpWebResponse)e.Response).StatusCode);
var description = (HttpWebResponse)e.Response).StatusDescription);
}
}
см. В MSDN о состоянии ответа:
...
catch(WebException e) {
Console.WriteLine("The following error occured : {0}",e.Status);
}
...
Поймай правильный тип исключения 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");
}
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
}
}
Я не тестировал это, но оно должно работать
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;
}