Я знаю, что могу локально, в своей файловой системе, проверить, существует ли файл:
if(File.Exists(path))
Можно ли проверить конкретный удаленный URL?
Я знаю, что могу локально, в своей файловой системе, проверить, существует ли файл:
if(File.Exists(path))
Можно ли проверить конкретный удаленный URL?
Если вы пытаетесь проверить наличие веб-ресурса, я бы рекомендовал использовать класс HttpWebRequest
. Это позволит вам отправить запрос HEAD
на указанный URL. Вернутся только заголовки ответов, даже если ресурс существует.
var url = "http://www.domain.com/image.png";
HttpWebResponse response = null;
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "HEAD";
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
/* A WebException will be thrown if the status of the response is not `200 OK` */
}
finally
{
// Don't forget to close your response.
if (response != null)
{
response.Close();
}
}
Конечно, если вы хотите загрузить ресурс, если он существует, скорее всего, будет более эффективным отправлять запрос GET
(не устанавливая свойство Method
на "HEAD"
, либо используя WebClient
).
Если вы хотите просто скопировать и вставить код Justin и получить метод для использования, вот как я его реализовал:
using System.Net;
public class MyClass {
static public bool URLExists (string url) {
bool result = false;
WebRequest webRequest = WebRequest.Create(url);
webRequest.Timeout = 1200; // miliseconds
webRequest.Method = "HEAD";
HttpWebResponse response = null;
try {
response = (HttpWebResponse)webRequest.GetResponse();
result = true;
} catch (WebException webException) {
Debug.Log(url +" doesn't exist: "+ webException.Message);
} finally {
if (response != null) {
response.Close();
}
}
return result;
}
}
Я буду следить за ним:
Если вы хотите загрузить ресурс и он существует, было бы более эффективно отправлять запрос
GET
, не устанавливая для свойстваMethod
значение"HEAD"
или используя классWebClient
.
Ниже приведена упрощенная версия кода:
public bool URLExists(string url)
{
bool result = true;
WebRequest webRequest = WebRequest.Create(url);
webRequest.Timeout = 1200; // miliseconds
webRequest.Method = "HEAD";
try
{
webRequest.GetResponse();
}
catch
{
result = false;
}
return result;
}
Если вы используете путь unc или подключенный диск, это будет работать нормально.
Если вы используете веб-адрес (http, ftp и т.д.), вам лучше использовать WebClient - вы получите WebException если он не существует.
public static bool UrlExists(string file)
{
bool exists = false;
HttpWebResponse response = null;
var request = (HttpWebRequest)WebRequest.Create(file);
request.Method = "HEAD";
request.Timeout = 5000; // milliseconds
request.AllowAutoRedirect = false;
try
{
response = (HttpWebResponse)request.GetResponse();
exists = response.StatusCode == HttpStatusCode.OK;
}
catch
{
exists = false;
}
finally
{
// close your response.
if (response != null)
response.Close();
}
return exists;
}
Моя версия:
public bool IsUrlExist(string url, int timeOutMs = 1000)
{
WebRequest webRequest = WebRequest.Create(url);
webRequest.Method = "HEAD";
webRequest.Timeout = timeOut;
try
{
var response = webRequest.GetResponse();
/* response is `200 OK` */
response.Close();
}
catch
{
/* Any other response */
return false;
}
return true;
}
Версия Anoter с таймаутом определения:
public bool URLExists(string url,int timeout = 5000)
{
...
webRequest.Timeout = timeout; // miliseconds
...
}