为什么在尝试从zip文件和普通文本文件发布内容时会获得404?

时间:2018-06-06 09:06:18

标签: asp.net-mvc asp.net-web-api httpclient mime-types dotnet-httpclient

我有一个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文件时,我错过了内容类型标题等,但不知道我错过了什么或做错了什么。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

不要把我的代码作为关于如何上传zip文件的福音,但事实证明错误是我在动作方法上只使用了[DisableRequestSizeLimit]属性,并且只禁用了Kestrel& #39;请求大小限制。 IIS仍有30MB的限制,我通过添加web.config来禁用以下内容:

<system.webServer>
  <security>
    <requestFiltering>
      <!-- 1 GB -->
      <requestLimits maxAllowedContentLength="1073741824" />
    </requestFiltering>
  </security>
</system.webServer>