【发布时间】:2021-09-03 01:19:24
【问题描述】:
我在 .net core 3.1 中有一个 REST API 端点,如下所示:
[Route("Install")]
[HttpPost]
[RequestSizeLimit(524288000)]
public async Task<IActionResult> AddInstallFile(List<IFormFile> files)
我可以通过以下命令使用 cURL 上传文件:
curl -X POST MYURL Content-Type: multipart/form-data" -F "files=@filename.zip;type=application/x-zip-compressed"
它也可以通过 swagger 工作
在 powershell 中,虽然 Multipart/form-data 本身不受支持,所以我使用以下代码上传到那里(本质上我使用了工作 swagger 上传和 chrome 开发工具中的“复制为 Powershell”功能来创建此代码) :
$fileBytes = [System.IO.File]::ReadAllBytes("C:\Temp\filename.zip");
$enc = [System.Text.Encoding]::GetEncoding('utf-8')
$fileEnc = $enc.GetString($fileBytes)
Invoke-WebRequest -Uri "MYURL" `
-Method "POST" `
-Headers @{
"method"="POST"
"accept"="application/octet-stream"
"accept-encoding"="gzip, deflate, br"
} `
-ContentType "multipart/form-data; boundary=----WebKitFormBoundaryT2XycANuthCIUwGk" `
-Body ([System.Text.Encoding]::UTF8.GetBytes("------WebKitFormBoundaryT2XycANuthCIUwGk$([char]13)$([char]10)Content-Disposition: form-data; name=`"files`"; filename=`"filename.zip`"$([char]13)$([char]10)Content-Type: application/x-zip-compressed$([char]13)$([char]10)$([char]13)$([char]10)$fileEnc$([char]13)$([char]10)------WebKitFormBoundaryT2XycANuthCIUwGk--$([char]13)$([char]10)"))
此 Powershell 代码适用于我拥有的小于 2MB 的 zip 文件,但不适用于另一个超过 80MB 的 zip 文件
服务器上的错误在这里:
An unhandled exception has occurred while executing the request.
Exception:
System.ArgumentNullException: Value cannot be null. (Parameter 'source')
at System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
at System.Linq.Enumerable.Sum[TSource](IEnumerable`1 source, Func`2 selector)
at netproject.ControllerClass.AddInstallFile(List`1 files) in ControllerClass.cs:line 44
基本上,当从 powershell 调用超过 ~50MB 的文件时,files 变量会以 null 的形式出现。 我已经尝试过 Invoke-WebRequest 和 Invoke-RestMethod,结果相同
【问题讨论】:
-
你检查了吗:Upload BIG files via HTTP?
-
对于小于 100MB 的文件不应该是必需的。他们谈论的是千兆字节的文件。老实说,开始认为我发现了一个 PowerShell 错误。代码适用于 50MB 以下的文件,然后莫名其妙地中断超过 80MB 的文件这一事实非常奇怪。我现在已经设法使用 Postman、swagger、cURL 和 web 表单,只是没有使用 powershell。
-
我进行了一些实验,但它在 80MB 左右开始失败。唯一的区别是实际文件。我使用相同的文件名和路径进行测试
标签: powershell rest .net-core