我的C#/ UWP应用有一个部分,用户可以在其中输入指向OneDrive文档和其他Web资源的链接作为参考信息。输入链接后,用户可以单击按钮来测试链接,以确保链接按预期启动。在启动URI之前,我需要验证链接目标是否存在,如果在尝试启动URI之前该链接无效,则会引发错误。
通过使用URL创建HttpWebRequest并评估响应的状态值来直接验证网站和非OneDrive基于Web的文档。 (请参见下面的示例代码。)
但是,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 && 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;
}
我可以使用Windows.System.Launcher.LaunchUriAsync
方法捕获405错误并启动URL。只要确实存在OneDrive文档,OneDrive链接就可以正常启动。
但是,如果该文档不存在,或者如果共享权限已被撤销,那么我最终会看到一个浏览器页面,出现类似[404 Not Found]错误的信息……正是我要避免的事情做验证!
是否有一种方法可以验证OneDrive共享链接,而无需在浏览器中实际启动它们?是否还有其他类型的链接(也许是bit.ly链接?)也以同样的方式产生问题?也许是一个更好的问题:是否可以以相同的方式验证所有Web资源,而只知道URL?
答案 0 :(得分:1)
避免重定向并使用共享链接访问项目元数据的最佳方法是制作一个API call to the shares endpoint。您将需要按照here的概述对URL进行编码,然后将其传递给API,例如:
HEAD https://api.onedrive.com/v1.0/shares/u!{encodedurl}