Как проверить, существует ли файл на веб-сервере по его URL? - PullRequest
9 голосов
/ 22 сентября 2009

в нашем приложении у нас есть какая-то онлайн помощь. Это работает очень просто: если пользователь нажимает кнопку справки, URL-адрес создается в зависимости от текущего языка и контекста справки (например, «http://example.com/help/" + [LANG_ID] +» [HELP_CONTEXT]) и вызывается из браузера.

Итак, мой вопрос: как я могу проверить, существует ли файл на веб-сервере без загрузки всего содержимого файла?

Спасибо за помощь!

Обновление: спасибо за вашу помощь. На мой вопрос ответили. Теперь у нас есть проблемы с проверкой подлинности прокси, и мы не можем отправить HTTP-запрос;)

Ответы [ 7 ]

20 голосов
/ 22 сентября 2009

Вы можете использовать .NET, чтобы выполнить запрос HEAD, а затем посмотреть на статус ответа.

Ваш код будет выглядеть примерно так (адаптировано из Низкоуровневый HTTP-запрос HEAD ):

// create the request
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

// instruct the server to return headers only
request.Method = "HEAD";

// make the connection
HttpWebResponse response = request.GetResponse() as HttpWebResponse;

// get the status code
HttpStatusCode status = response.StatusCode;

Вот список подробных кодов , которые могут быть возвращены перечислителем StatusCode.

2 голосов
/ 22 сентября 2009

Можем ли мы предположить, что ваше веб-приложение запущено на том же веб-сервере, с которого вы получаете справочные страницы? Если да, вы можете использовать метод Server.MapPath, чтобы найти путь к файлу на сервере в сочетании с методом File.Exists из пространства имен System.IO, чтобы подтвердить, что файл существует.

1 голос
/ 22 сентября 2009

Взгляните на класс HttpWebResponse . Вы могли бы сделать что-то вроде этого:

string url = "http://example.com/help/" + LANG_ID + HELP_CONTEXT;
WebRequest request=WebRequest.Create(URL);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusDescription=="OK") 
{
   // worked
}
1 голос
/ 22 сентября 2009

Отправьте запрос HEAD для URL (вместо GET). Сервер вернет 404, если он не существует.

0 голосов
/ 02 апреля 2019

У меня была такая же проблема, и я нашел этот вопрос и ответы здесь действительно полезными.

Но ответы здесь используют старый WebRequest-класс , который немного устарел, он не поддерживает асинхронную загрузку. Поэтому я хотел использовать более современный способ сделать это с HttpClient . Вот пример с небольшим вспомогательным классом, чтобы проверить, существует ли файл:

using System.Net.Http;
using System.Threading.Tasks;

class HttpClientHelper
{
    private static HttpClient _httpClient;

    public static async Task<bool> DoesFileExist(string url)
    {
        if (_httpClient == null)
        {
            _httpClient = new HttpClient();
        }

        using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Head, url))
        {
            using (HttpResponseMessage response = await _httpClient.SendAsync(request))
            {
                return response.StatusCode == System.Net.HttpStatusCode.OK;
            }
        }
    }
}

Использование:

if (await HttpClientHelper.DoesFileExist("https://www.google.com/favicon.ico"))
{
    // Yes it does!  
}
else
{
    // No it doesn't!
}
0 голосов
/ 22 сентября 2009

Если вы хотите проверить статус документа на сервере:

function fetchStatus(address) {
 var client = new XMLHttpRequest();
 client.onreadystatechange = function() {
  // in case of network errors this might not give reliable results
  if(this.readyState == 4)
   returnStatus(this.status);
 }
 client.open("HEAD", address);
 client.send();
}

Спасибо.

0 голосов
/ 22 сентября 2009

РЕДАКТИРОВАТЬ: видимо, хороший способ сделать это будет запрос HEAD.

Вы также можете создать серверное приложение, которое хранит название каждой доступной веб-страницы на сервере. Ваше клиентское приложение может затем запросить это приложение и ответить немного быстрее, чем запрос на полную страницу, и не выдавать ошибку 404 каждый раз, когда файл не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...