【问题标题】:Restsharp 107.x ExecuteAsync upload file to uploadsession fails (GraphAPI Sharepoint), 106.x does workRestsharp 107.x ExecuteAsync 上传文件到 uploadsession 失败(GraphAPI Sharepoint),106.x 确实有效
【发布时间】:2022-06-15 20:12:15
【问题描述】:

我的以下代码在 106.15 上正常工作,我获得了成功状态。项目是 Visual Studio 2022 (.Net 4.8)

accessToken = GetAccessToken()
Dim rRequest As RestRequest
Dim rClient As RestClient
Dim rResponse As RestResponse

Try
    Dim data() As Byte = File.ReadAllBytes(fileSource)
    
    rClient = New RestClient("https://graph.microsoft.com/v1.0")
    rRequest = New RestRequest(uploadURL, Method.Put)

    rRequest.AddHeader("Authorization", "Bearer " & accessToken)
    rRequest.AddHeader("Content-Range", New ContentRangeHeaderValue(0, data.Length - 1, data.Length).ToString)
    rRequest.AddHeader("Content-Length", data.Length)
    rRequest.AddParameter("application/binary", data, ParameterType.RequestBody)

    rResponse = Await rClient.ExecuteAsync(rRequest)

当我在 107.15 上执行代码时,它失败并出现以下错误:发送请求时出错(翻译自荷兰语)

知道什么地方可能出错或应该改变吗?

【问题讨论】:

    标签: vb.net restsharp


    【解决方案1】:

    请阅读documentation。

    不要使用这个:

    rRequest.AddHeader("Content-Range", New ContentRangeHeaderValue(0, data.Length - 1, data.Length).ToString)
    rRequest.AddHeader("Content-Length", data.Length)
    rRequest.AddParameter("application/binary", data, ParameterType.RequestBody)
    

    请改用AddFile。

    您仍然可以使用 AddHeader 手动添加 Content-Range 标头。由于您没有上传文件(尽管您会这样做),因此您可能没有文件名。在这种情况下,你可以试试这个:

    rRequest
        .AddBody(data)
        .AddHeader("Content-Range", New ContentRangeHeaderValue(0, data.Length - 1, data.Length).ToString())
    

    AddBody获取字节数组时,会使用application/binary的内容类型,并正确设置长度。

    【讨论】:

    • 谢谢 Alexey,我在发布之前阅读了课程文档 ;-)。但是 AddFile 在使用上传会话时不能与 Graph API 一起使用,内容范围标头和内容长度是必需的标头,因为您可以上传完整或部分文件,如果它们不存在则它总是 nag : (" {""error"":{""code"":""invalidRequest"",""message"":""Content-Range 标头丢失或格式错误。""}}") docs.microsoft.com/en-us/graph/api/… 显示如何这样做,这在 106.15 中确实有效。降级到 106.15 还是可以修复?
    • 只有在您上传文件的一部分时才需要Content-Range 标头。但是你的代码上传了整个东西,它失败了真的很奇怪。
    • 问题是 RestSharp 使用StreamContent 假设 来设置所有正确的标题。但同样,Content-Range 标头不能是必需的标头。
    • 如果我只做 .addbody 和 .addheader(Content-Range 它给出这个:"{""error"":{""code"":""invalidRequest"",""message "":""Content-Range 标头长度与提供的字节数不匹配。""}}"。有什么技巧可以检查设置的长度吗?
    • RestSharp 正确设置了长度,我不确定会发生什么。您可以使用 requestbin.com 并使用 RS 106 和 107 将您的请求发送到那里,以查看标头的差异。它会让您更好地了解正在发生的事情。
    【解决方案2】:

    @alexey,看起来 108.0.1 解决了这个问题,它现在可以工作了 :-)

    https://github.com/restsharp/RestSharp/commit/a7d2662ef95269fab1e6dac2ef2ad3003c5c1e85

    感谢

    【讨论】:

      猜你喜欢
      • 2018-02-01
      • 2014-06-04
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多