Как проверить существование документа OneDrive через его ссылку на общий доступ?

#c# #uwp #onedrive

#c# #uwp #onedrive

Вопрос:

В моем приложении C # / UWP есть раздел, в котором пользователи могут вводить ссылки на документы OneDrive и другие веб-ресурсы в качестве справочной информации. Пользователь может нажать кнопку, чтобы проверить ссылку после того, как они ввели ее, чтобы убедиться, что она запускается должным образом. Мне нужно проверить, существует ли целевая ссылка перед запуском URI, и выдать сообщение об ошибке, если ссылка недействительна, прежде чем пытаться запустить URI.

Проверить веб-сайты и веб-документы, отличные от OneDrive, проще простого, создав HttpWebRequest с использованием URL-адреса и оценив значение статуса ответа. (Смотрите пример кода ниже.)

Однако ссылки на общий доступ к документу OneDrive, похоже, имеют проблемы с этим подходом, возвращая ошибку [Метод 405 не разрешен]. Я предполагаю, что это связано с тем, что ссылки на общий доступ в OneDrive выполняют множество пересылок и перенаправлений, прежде чем они попадут в фактический документ.

 try
{
    // Create the HTTP request
    HttpWebRequest request = WebRequest.Create(urlString) as HttpWebRequest;
    request.Timeout = 5000;    // Set the timeout to 5 seconds -- don't keep the user waiting too long!
    request.Method  = "HEAD";  // Get only the header information -- no need to download page content



    // Get the HTTP response
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        // Get the response status code
        int statusCode = (int)response.StatusCode;

        // Successful request...return true
        if (statusCode >= 100 amp;amp; statusCode < 400)
        {
            return true;
        }

        // Unsuccessful request (server-side errors)...return false
        else // if (statusCode >= 500 amp;amp; statusCode < 600)
        {
            Log.Error( $"URL not valid. Server error. (Status = {statusCode})" );
            return false;
        }
    }
}


// Handle HTTP exceptions
catch (WebException e)
{
    // Get the entire HTTP response from the exception
    HttpWebResponse response = (HttpWebResponse)e.Response;


    // Grab the HTTP status code from the response
    int statusCode = (int)response.StatusCode;


    // Unsuccessful request (client-side errors)...return false
    if (statusCode >= 400 amp;amp; statusCode <= 499)
    {
        Log.Error( $"URL not valid. Client error. (Status = {statusCode})" );
        return false;
    }
    else // Unhandled errors
    {
        Log.Error( $"Unhandled status returned for URL. (Status = {e.Status})" );
        return false;
    }
}


// Handle non-HTTP exceptions
catch (Exception e)
{
    Log.Error( $"Unexpected error. Could not validate URL." );
    return false;
}
  

Я могу перехватить ошибку 405 и запустить URL в любом случае, используя Windows.System.Launcher.LaunchUriAsync метод. Ссылка на OneDrive запускается просто отлично…ЕСЛИ документ OneDrive действительно существует.

Но если документ не существует или если разрешения на общий доступ были отозваны, я получаю страницу браузера с чем-то вроде ошибки [404 Не найдено] … именно то, чего я пытаюсь избежать, выполняя проверку!

Есть ли способ проверить ссылки на общий ресурс OneDrive, фактически не запуская их в браузере? Существуют ли другие типы ссылок (bit.ly возможно, ссылки?) это также создает проблемы таким же образом? Возможно, лучший вопрос: могу ли я проверить ВСЕ веб-ресурсы таким же образом, не зная ничего, кроме URL?

Ответ №1:

Лучший способ избежать перенаправлений и получить доступ к метаданным элемента с помощью ссылки общего доступа — это выполнить вызов API к конечной точке общего доступа. Вы захотите закодировать свой URL, как указано здесь, и передать его в API, например:

 HEAD https://api.onedrive.com/v1.0/shares/u!{encodedurl}