В приложении 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?