我有一个MVC跨Web API应用程序,其ApiFileController
标题为:
[Produces("application/json")]
[Route("api/File")]
public class ApiFileController : ApiBaseController
它有以下行动方法
[HttpPost("PostDir")]
[DisableRequestSizeLimit]
public async Task<IActionResult> PostDir(string serverPath)
{
using (var fileStream = new FileStream(serverPath, FileMode.Create, FileAccess.Write))
{
await Request.Body.CopyToAsync(fileStream);
}
return Ok();
}
应该接收包含目录的zipfile,并将其解压缩到serverPath
参数中。然而,当我尝试按如下方式发布文件时:
sourcePath = Path.Combine("Temp", Guid.NewGuid() + ".zip");
System.IO.Compression.ZipFile.CreateFromDirectory(localPath, sourcePath, CompressionLevel.Fastest, true);
...
using (var fileStream = File.Open(sourcePath, FileMode.Open, FileAccess.Read))
{
using (var reader = new StreamReader(fileStream))
using (var content = new StreamContent(reader.BaseStream))
{
var uri = $"api/File/PostDir?serverPath={WebUtility.UrlEncode(serverPath)}";
var resp = await _client.PostAsync(uri, content);
resp.EnsureSuccessStatusCode();
}
}
我得到了404 - 没找到。如果我发布纯文本文件,如下所示,
using (var fileStream = File.Open(localPath, FileMode.Open, FileAccess.Read))
{
using (var reader = new StreamReader(fileStream))
using (var content = new StreamContent(reader.BaseStream))
{
var uri = $"api/File/PostDir?serverPath={WebUtility.UrlEncode(serverPath)}";
var resp = await _client.PostAsync(uri, content);
resp.EnsureSuccessStatusCode();
}
}
其中localPath
指向纯文本文件,正确调用PostDir
操作并正确保存文本文件。
我在包装器类中使用HttpClient
来发出请求,并在包装器的ctor中初始化如下:
public ApiClient()
{
var baseAddress = ConfigurationManager.AppSettings["ApiUrl"];
_client = new HttpClient();
_client.BaseAddress = new Uri(baseAddress);
_client.DefaultRequestHeaders.Clear();
_client.DefaultRequestHeaders.ConnectionClose = false;
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
我怀疑在发布二进制zip文件时,我错过了内容类型标题等,但不知道我错过了什么或做错了什么。有人可以帮忙吗?
答案 0 :(得分:0)
不要把我的代码作为关于如何上传zip文件的福音,但事实证明错误是我在动作方法上只使用了[DisableRequestSizeLimit]
属性,并且只禁用了Kestrel& #39;请求大小限制。 IIS仍有30MB的限制,我通过添加web.config
来禁用以下内容:
<system.webServer>
<security>
<requestFiltering>
<!-- 1 GB -->
<requestLimits maxAllowedContentLength="1073741824" />
</requestFiltering>
</security>
</system.webServer>