我正在尝试使用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];
共享链接由其他用户创建,其范围类型为“匿名”,链接类型为“编辑”,并且已在我的应用中登录的用户尝试访问共享文件夹的内容。 但得到同样的错误。 我在这里找不到我错的地方!
答案 0 :(得分:0)
感谢您的反馈。从其他用户使用“匿名”范围创建的共享链接下载内容时,Microsoft Graph API中似乎存在问题。
要了解此处发生的情况,您可以利用fiddler和source code of Microsoft Graph .NET Client Library。您可以下载源代码表单Releases并将它们添加到项目中进行调试。
当您致电var content = await request1.Request().GetAsync();
时,它最终会调用SendAsync
方法发送如下请求:
正如document所述,这会返回一个302 Found
响应,重定向到该文件的预先验证的下载URL。并且下载URL位于响应中的Location
标题中。
使用handles redirect方法的图表库HandleRedirect
并发送another request with the download URL in Location
。但是,此请求会返回403 Forbidden
响应
对于403 Forbidden
响应,图表库throws UnexpectedExceptionResponse
。这就是为什么你得到“服务返回意外异常”的原因。错误。
解决方法:强>
我们无法从Microsoft Graph API返回的下载URL下载内容,但我们可以在使用浏览器时下载。所以我在使用Edge下载时检查了HTTP(s)流量,发现浏览器中使用的API端点不同
如您所见,它使用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();