如何通过其共享链接验证OneDrive文档的存在?

时间:2019-04-05 22:04:30

标签: c# uwp onedrive

我的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?

1 个答案:

答案 0 :(得分:1)

避免重定向并使用共享链接访问项目元数据的最佳方法是制作一个API call to the shares endpoint。您将需要按照here的概述对URL进行编码,然后将其传递给API,例如:

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