文件上传到 SharePoint 不起作用,并且未引发任何错误

问题描述 投票:0回答:1

我必须将文件上传到特定文件夹内的共享点位置,为此我添加了以下代码行,

public async Task UploadFileAsync(string siteId, string driveId, string folderId, string fileName, byte[] fileContent, string accessToken)
{
    HttpClient _httpClient = new HttpClient();
    _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

    try
    {
         var requestUrl = $"https://graph.microsoft.com/v1.0/sites/{siteId}/drives/{driveId}/items/{folderId}:/{fileName}:/content";


        using (var content = new ByteArrayContent(fileContent))
        {
            content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

            var response = await _httpClient.PutAsync(requestUrl, content);

            if (response.IsSuccessStatusCode)
            {
                Console.WriteLine("File uploaded successfully.");
            }
            else
            {
                Console.WriteLine($"Failed to upload file. Status: {response.StatusCode}, Error: {await response.Content.ReadAsStringAsync()}");
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Exception: {ex.Message}");
    }
}

但是这段代码对我不起作用,即使它没有抛出任何错误。当我调试代码时,它停在以下行:

var response = await _httpClient.PutAsync(requestUrl, content);

我已分配以下权限:

enter image description here

任何人都可以帮我解决这个问题吗?

c# .net sharepoint microsoft-graph-api sharepoint-online
1个回答
0
投票

您似乎已设置权限并实现了代码以使用 Microsoft Graph API 将文件上传到 SharePoint 文件夹,但代码执行停在以下行:

var response = await _httpClient.PutAsync(requestUrl, content);

请确保授予以下权限:

Microsoft Graph - Files.ReadWrite.All:需要完全访问用户可以访问的所有文件。 SharePoint - Sites.FullControl.All:允许完全控制所有网站集,这通常是上传文件所必需的。 确保这些权限已获得管理员同意。

确保您使用的访问令牌具有正确的范围。它应包含 Files.ReadWrite.All 或 Sites.FullControl.All 等权限。如果令牌范围不正确,您的请求将默默失败。

也请尝试使用文件夹路径而不是folderId,例如:

    var requestUrl = $"https://graph.microsoft.com/v1.0/sites/{siteId}/drives/{driveId}/root:/{folderPath}/{fileName}:/content";

如果程序仅在 PutAsync() 处停止,则可能是网络问题或超时。

请尝试以下操作: 增加超时:设置 HttpClient 的超时。

_httpClient.Timeout = TimeSpan.FromMinutes(5);

另请检查代理和防火墙设置。

由于 PutAsync 调用刚刚停止,因此可能存在未处理的异常。考虑将 PutAsync 包装在 try-catch 块中并详细记录异常:

尝试:

{
var response = await _httpClient.PutAsync(requestUrl, content);
}
catch (HttpRequestException httpEx)
{
  Console.WriteLine($"HttpRequestException: {httpEx.Message}");
}
 catch (TaskCanceledException tcex)
{
Console.WriteLine($"TaskCanceledException (likely a timeout): {tcex.Message}");
}
catch (Exception ex)
{
  Console.WriteLine($"Unexpected Exception: {ex.Message}");
}

如果响应不是 IsSuccessStatusCode,请检查响应以获取更多信息:

var response = await _httpClient.PutAsync(requestUrl, content);

if (!response.IsSuccessStatusCode)
{
   var errorContent = await response.Content.ReadAsStringAsync();
   Console.WriteLine($"Failed to upload file. Status Code: 
{response.StatusCode}, Error: {errorContent}");
}

您可以尝试使用 Microsoft Graph SDK,而不是直接使用 HttpClient:

安装 SDK 并获取代码,如果需要帮助,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.