У меня есть кросс-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-файлов ямне не хватает заголовка типа контента или чего-то подобного, но я понятия не имею, что я пропускаю или делаю неправильно.Может ли кто-нибудь помочь, пожалуйста?