Как проверить существование документа OneDrive по его ссылке Share? - PullRequest
1 голос
/ 06 апреля 2019

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

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

Тем не менее, ссылки на общий доступ к документам OneDrive, похоже, имеют проблемы с этим подходом, возвращая ошибку [405 Method Not Allowed]. Я предполагаю, что это потому, что ссылки общего доступа 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 && statusCode < 400)
        {
            return true;
        }

        // Unsuccessful request (server-side errors)...return false
        else // if (statusCode >= 500 && 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 && 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 Not Found] ... именно то, чего я пытаюсь избежать делает проверку!

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

1 Ответ

1 голос
/ 07 апреля 2019

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

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