C# 无法在Azure Devops中打开附加到工作项的Excel文件

C# 无法在Azure Devops中打开附加到工作项的Excel文件,c#,rest,api,azure-devops,C#,Rest,Api,Azure Devops,我正在使用Azure Devops REST API创建一个用于将excel文件附加到工作项的工具。我可以将excel文件添加到工作项,但当我尝试打开时,它只是说文件foramt或文件扩展名无效。我感谢您的任何建议或意见 编辑: 根据Lance Li的建议,我将excel文件转换为字节,并将其发送到请求正文中,如下所示 byte[] filedata = File.ReadAllBytes(filepath); dynamic WorkItem = new List<dynamic>

我正在使用Azure Devops REST API创建一个用于将excel文件附加到工作项的工具。我可以将excel文件添加到工作项,但当我尝试打开时,它只是说文件foramt或文件扩展名无效。我感谢您的任何建议或意见

编辑: 根据Lance Li的建议,我将excel文件转换为字节,并将其发送到请求正文中,如下所示

 byte[] filedata = File.ReadAllBytes(filepath);
dynamic WorkItem = new List<dynamic>() {

                new
                {

                  filedata,
                }

            };
    var WorkItemValue = new StringContent(JsonConvert.SerializeObject(WorkItem),Encoding.UTF8, "application/json-patch+json");
现在,将上述workitem值发送到内容类型为application\octet stream的post方法。但我仍然面临格式问题。我犯了什么错误吗?

通常我们将附件上载到附件存储,然后将附件从附件存储添加到工作项,以将本地附件添加到工作项

问题原因:

当我们使用FirstRestAPIAttachments-Create上传附件时,我们应该小心。在post请求中,filename=xxx没有收到文件的任何路径。它不会从桌面或其他文件夹获取文件

经过几次测试,我复制了与您相同的问题。我还发现,如果我们运行post请求,它实际上只是创建了一个同名的新文件,而不是获取本地文件。例如,如果我有一个本地test.txt文件,其中的内容仅用于测试,那么在我的请求正文中我有要上载的用户文本内容,结果是得到一个名为test.txt的附件,其中的内容为要上载的用户文本内容

所以我想你可以上传一个包含文本内容的xx.xlsx文件。这就是为什么我们得到的文件foramt无效错误

两个变通办法:

1.上传为,将excel文件转换为二进制文件,并将二进制内容粘贴到请求体。关于是否可以转换excel以及如何转换,这是另一个问题,所以我不在这里讨论

2.我最终找到的另一个解决方法是在Invoke-RestMethod命令中使用-infle,效果很好

如果您使用postman之类的工具来运行api,contenttype=>application/octet-stream,body=>binary

关于附件的My Powershell脚本创建:

希望以上所有内容都能有所帮助:由于最初问题的原因只是关于第一个api的使用,所以我不会在这里讨论第二个api


此外:如果有人正在使用C客户端api上载二进制文件,请尝试使用contenttype application\json,来自dhulipala murali的信息。如果有人使用PS/postman,应用程序/octet流在我这边运行良好。

谢谢@Lance Li MSFT,我尝试将文件作为二进制文件发送,但问题仍然存在。我在上面添加了我的代码。你能纠正我吗?要成功上传一个本地文件,我们需要使用两个API,第一个的内容类型是application/octet stream,第二个是application/json patch+json。非常感谢much@LanceLi MSFT,你的想法对我起了作用。现在我可以上传和打开没有任何格式问题。但有一个小小的更正,我们只能使用application\json上传二进制文件。当我使用application\octet stream时,出现了一个错误。@dhulipalamurali很好的提示!我将使用以下有用信息更新答案:
$token = "YourPat"

$url="https://dev.azure.com/YourOrgName/_apis/wit/attachments?fileName=YourFileName.xlsx&api-version=5.1"

$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))

$filepath="YourFilePath\YourFileName.xlsx"

$response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Post -InFile $filepath -ContentType application/octet-stream

Write-Host $response