#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}