Почему я получаю 404 при попытке опубликовать содержимое из ZIP-файла по сравнению с обычным текстовым файлом? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть кросс-API-приложение MVC с заголовком 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();
}

, который должен получитьzip-файл, содержащий каталог, и распакуйте его в параметр 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 голосов
/ 08 июня 2018

Не воспринимайте мой код как евангелие о том, как загрузить zip-файл, но оказывается, что ошибка заключалась в том, что я использовал только атрибут [DisableRequestSizeLimit] в методе действия, а это отключало только ограничение размера запроса Kestrel.IIS по-прежнему имеет ограничение в 30 МБ, которое я отключил, добавив web.config со следующим:

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