【发布时间】:2018-06-07 09:15:31
【问题描述】:
我对@987654321@ 和 Web API 之间的文件传输非常陌生,所以请原谅我的代码中的任何无知和猜测。我一直在尝试将使用System.IO.Compression.ZipFile 创建的文件发布到我的 Web API 大约一天,但总是收到 404 响应。如果我使用空流发布,则会调用 API 操作方法,因此我知道 404 是由于内容而不是 URI。
此方法位于尝试发布文件的客户端 WPF 应用程序中:
public async Task PostDirAsync(string localDirPath, string serverDir)
{
var sourcePath = Path.Combine("Temp", Guid.NewGuid() + ".zip");
ZipFile.CreateFromDirectory(localDirPath, sourcePath, CompressionLevel.Fastest, true);
StreamContent streamContent;
using (var fs = File.Open(sourcePath, FileMode.Open))
{
var outStream = new MemoryStream();
await fs.CopyToAsync(outStream);
outStream.Position = 0;
streamContent = new StreamContent(outStream);
}
streamContent.Headers.Add("Content-Type", "application/octet-stream");
var resp = await _client.PostAsync("api/File/PostDir?serverPath={WebUtility.UrlEncode(serverDir)}", streamContent);
}
这是接收帖子的 Web API 中的操作方法,但前提是我在尝试发布之前不执行 outStream.Position = 0;:
[HttpPost("PostDir")]
[DisableRequestSizeLimit]
public async Task<IActionResult> PostDir(string serverPath)
{
var zipName = Path.Combine(_config["QuickDrive:TempDir"], Guid.NewGuid() + ".zip");
using (var ms = new MemoryStream())
using (var fileStream = System.IO.File.Create(zipName))
{
await Request.Body.CopyToAsync(ms);
ms.Position = 0;
await ms.CopyToAsync(fileStream);
}
return Ok();
}
action 方法被调用并在空流的情况下运行而没有错误,但由于它写入一个空文件,所以非常无用。我做错了什么?
【问题讨论】:
-
我希望当您调用
ms.CopyToAsync(fileStream);时,您将处于ms流的末尾。在该行之前,您可能需要ms.Position = 0;之类的内容。 -
@KirkLarkin 不,仍然是一个空文件。
-
还有类似的情况,您将
StreamContent设置为可能已经在末尾的流。如果有帮助,您应该能够在调试器中看到这些流的位置和长度。也请查看Request.Body流。 -
@KirkLarkin 看起来你是对的。当我在
streamContent = new StreamContent(outStream);之前执行outStream.Posiition = 0时,我现在得到我的老朋友404 响应。streamContent之前似乎是空的,但现在它有内容,并且 web api 对象与该内容的类型有关。
标签: c# asp.net-core asp.net-core-2.0 dotnet-httpclient kestrel-http-server