Я пишу диагностическую страницу для SiteScope, и одна область, которую нам нужно проверить, - это доступность подключения к файловым / мультимедийным ресурсам с веб-сервера. Один из способов, которым я могу это сделать, - это загрузить изображение с помощью кода и проверить, является ли сообщение о состоянии IIS 200.
Итак, в основном я должен иметь возможность перейти на сайт в папку, подобную этой: /media/1/image.jpg, и посмотреть, вернет ли она 200 ... если не выбросить исключение.
Я изо всех сил пытаюсь понять, как написать этот код.
Любая помощь приветствуется.
Спасибо
Возможный дубликат Как проверить, существует ли файл на веб-сервере по его URL-адресу?





Просто используйте HEAD. Нет необходимости загружать все изображение, если оно вам не нужно. Вот какой-то шаблонный код.
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("url");
request.Method = "HEAD";
bool exists;
try
{
request.GetResponse();
exists = true;
}
catch
{
exists = false;
}
Можно ли применить этот метод к папкам, если они существуют или нет?
@JL, какие папки? файловая система ??
Разве это не вернется к каждому файлу, а не только к изображениям?
Вместо этого я бы посмотрел на HttpWebRequest - я думаю, что предыдущий ответ фактически загрузит данные, тогда как вы сможете получить ответ без данных из HttpWebRequest.
http://msdn.microsoft.com/en-us/library/456dfw4f.aspx до шага № 4 должно помочь. В HttpWebResponse есть и другие поля для получения числового кода, если это необходимо ...
hth Джек
Единственное, что он загрузит, - это заголовок ответа, который по определению является «ответом».
Я использовал что-то подобное раньше, но, вероятно, есть способ получше:
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://somewhere/picture.jpg");
request.Credentials = System.Net.CredentialCache.DefaultCredentials;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
myImg.ImageUrl = "http://somewhere/picture.jpg";
}
catch (Exception ex)
{
// image doesn't exist, set to default picture
myImg.ImageUrl = "http://somewhere/default.jpg";
}
Возможно, вы захотите также проверить, что у вас есть код состояния OK (например, HTTP 200) и что тип mime из объекта ответа соответствует тому, что вы ожидаете. Вы можете расширить это по строкам,
public bool doesImageExistRemotely(string uriToImage, string mimeType)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriToImage);
request.Method = "HEAD";
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK && response.ContentType == mimeType)
{
return true;
}
else
{
return false;
}
}
catch
{
return false;
}
}
Я хотел бы добавить, что если вы добавите оператор using вокруг запроса HttpWebResponse ... вы убедитесь, что ваше приложение не зависнет после трех последовательных запросов. Этот сценарий может возникнуть при использовании BackgroundWorker. using (HttpWebResponse response = (HttpWebResponse) request.GetResponse ()) {// здесь логика}
Также, если вы получите ошибку ProtocolError (удаленный сервер вернул ошибку: (500) Internal Server Error), измените: request.Method = "GET";
Какой mimeType нужно указать для изображения?
Вы должны избавиться от объекта HTTPWebResponse, иначе у вас будут проблемы, как у меня ...
public bool DoesImageExistRemotely(string uriToImage)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriToImage);
request.Method = "HEAD";
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode == HttpStatusCode.OK)
{
return true;
}
else
{
return false;
}
}
}
catch (WebException) { return false; }
catch
{
return false;
}
}
Если вы получаете исключение во время запроса типа «Удаленный сервер возвратил ошибку: (401) Неавторизован.»,
Это можно решить, добавив следующую строку
request.Credentials = new NetworkCredential(username, password);
К этому вопросу добавлены вопросы и ответы от проверьте, существует ли изображение в интрасети.
Если URL существует как http: \ server.myImageSite.com, ответ тоже ложный. только если imageSize> 0 истинно.
public static void GetPictureSize(string url, ref float width, ref float height, ref string err)
{
System.Net.HttpWebRequest wreq;
System.Net.HttpWebResponse wresp;
System.IO.Stream mystream;
System.Drawing.Bitmap bmp;
bmp = null;
mystream = null;
wresp = null;
try
{
wreq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url);
wreq.AllowWriteStreamBuffering = true;
wresp = (HttpWebResponse)wreq.GetResponse();
if ((mystream = wresp.GetResponseStream()) != null)
bmp = new System.Drawing.Bitmap(mystream);
}
catch (Exception er)
{
err = er.Message;
return;
}
finally
{
if (mystream != null)
mystream.Close();
if (wresp != null)
wresp.Close();
}
width = bmp.Width;
height = bmp.Height;
}
public static bool ImageUrlExists(string url)
{
float width = 0;
float height = 0;
string err = null;
GetPictureSize(url, ref width, ref height, ref err);
return width > 0;
}
Что, если я хочу протестировать страницу с URL-адресом вроде
http://localhost/homepageи посмотреть, есть ли на этой странице отсутствующее изображение? Моя первоначальная идея - прочитать страницу с помощьюHttpWebRequest, получить ответ, а затем просмотреть содержимое, для каждого элемента <img> порождать другой запрос. Есть какая-нибудь другая идея?