无法使用Microsoft.Graph通过共享链接下载文件夹的内容

时间:2017-03-11 19:10:09

标签: c# visual-studio office365 onedrive microsoft-graph

我正在尝试使用Microsoft.Graph API获取Onedrive中共享文件夹中包含的文件。我的代码是:

public static GraphServiceClient GetGraphServiceClient()
        {
            if (graphClient == null)
            {
                // Create Microsoft Graph client.
                try
                {
                    graphClient = new GraphServiceClient(
                        "https://graph.microsoft.com/v1.0",
                        new DelegateAuthenticationProvider(
                            async (requestMessage) =>
                            {
                                var token = await GetTokenForUserAsync();
                                requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
                            }));
                    return graphClient;
                }

                catch (Exception ex)
                {
                }
            }
    void GetFile()
    {
    graphclient = AuthenticationHelper.GetGraphServiceClient();
    var request = graphclient.Shares[get_encoded_link()].Root.Children;
                var foundFile = await request.Request().GetAsync();

                var request1 = graphclient.Shares[get_encoded_link()].Items[foundFile[0].Id].Content;
                var content = await request1.Request().GetAsync();
    }

在foundfile中,我获取文件夹中文件的所有详细信息。但是,当我使用其id请求文件的内容时,我得到此错误 “从服务返回意外的异常” 我还尝试使用root.itemsPath [filename]

请求内容
var request1 = graphclient.Shares[get_encoded_link()].Root.ItemsPath[filename];

共享链接由其他用户创建,其范围类型为“匿名”,链接类型为“编辑”,并且已在我的应用中登录的用户尝试访问共享文件夹的内容。 但得到同样的错误。 我在这里找不到我错的地方!

1 个答案:

答案 0 :(得分:0)

感谢您的反馈。从其他用户使用“匿名”范围创建的共享链接下载内容时,Microsoft Graph API中似乎存在问题。

要了解此处发生的情况,您可以利用source code of Microsoft Graph .NET Client Library。您可以下载源代码表单Releases并将它们添加到项目中进行调试。

当您致电var content = await request1.Request().GetAsync();时,它最终会调用SendAsync方法发送如下请求:
enter image description here

正如document所述,这会返回一个302 Found响应,重定向到该文件的预先验证的下载URL。并且下载URL位于响应中的Location标题中。

使用handles redirect方法的图表库HandleRedirect并发送another request with the download URL in Location。但是,此请求会返回403 Forbidden响应 enter image description here

对于403 Forbidden响应,图表库throws UnexpectedExceptionResponse。这就是为什么你得到“服务返回意外异常”的原因。错误。

解决方法:

我们无法从Microsoft Graph API返回的下载URL下载内容,但我们可以在使用浏览器时下载。所以我在使用Edge下载时检查了HTTP(s)流量,发现浏览器中使用的API端点不同 enter image description here 如您所见,它使用api.onedrive.com作为端点而不是graph.microsoft.com。因此,我们可以将RequestUri更改为解决方法。

var sharingLink = @"{Sharing Link}";

var foundFile = await graphClient.Shares[UrlToSharingToken(sharingLink)].Root.Children.Request().GetAsync();

var request = graphClient.Shares[UrlToSharingToken(sharingLink)].Items[foundFile[0].Id].Content.Request().GetHttpRequestMessage();

request.RequestUri = new Uri(request.RequestUri.AbsoluteUri.Replace("graph.microsoft.com", "api.onedrive.com"));

var response = await graphClient.HttpProvider.SendAsync(request);

var stream = await response.Content.ReadAsStreamAsync();