Http клиент Post с параметром body и файлом в c # - PullRequest
0 голосов
/ 22 мая 2019

Я пытался прикрепить файл csv в качестве параметра тела в моем тестовом скрипте. Но все же в соответствии с приведенным ниже кодом ожидают файл контроллера и просто интересно, как я должен передать это.

Я запускаю тестовый скрипт в следующем порядке

Метод-1

public void AttachedRatesFile(string fileName)
            {            
                _form = string.IsNullOrWhiteSpace(fileName)
                    ? _form = new StringContent(string.Empty)
                    : _form = new StreamContent(File.OpenRead($"{ResourceFolder}{fileName}"));
                _form.Headers.ContentType = new MediaTypeHeaderValue("application/csv");
                _form.Headers.ContentDisposition = new ContentDispositionHeaderValue(fileName);
            }

Способ-2

        public void PostRequestExecutes(string resource)
        {
            var content = new MultipartFormDataContent{_form};
            WhenThePostRequestExecutesWithContent(resource, content);
        } 

Метод-3

public async void WhenThePostRequestExecutesWithContent(string resource, HttpContent content)
{
    ResponseMessage = await HttpClient.PostAsync(resource, content);
}

Я вижу ноль в параметре файла

Контроллер:

public async Task<IActionResult> SeedData(IFormFile file)
{
    var result = await _seedDataService.SeedData(file);
    return Ok(new { IsUploadSuccesful = result});
}

1 Ответ

1 голос
/ 22 мая 2019

Я бы добавил это к телу как поток

var memoryContentStream = new MemoryStream();

using (var streamWriter = new StreamWriter(memoryContentStream, Encoding.UTF8, 1000, 
true))
{
  using (var jsonTextWriter = new JsonTextWriter(streamWriter))
  {
    var jsonSerializer = new JsonSerializer();

    jsonSerializer.Serialize(jsonTextWriter, OBJECT);
    jsonTextWriter.Flush();
  }
}

if (memoryContentStream.CanSeek)
{
  memoryContentStream.Seek(0, SeekOrigin.Begin);
}

Тогда

using (var streamContent = new StreamContent(memoryContentStream))
            {
                streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                request.Content = streamContent;

                using (var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
                {
                    var stream = await response.Content.ReadAsStreamAsync();

                    response.EnsureIsSuccessStatusCode();

                }
            }

Выше будет сначала записать содержимое в виде потока памяти, а затем при создании запроса POST вы можете отправить поток в виде streamContent

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...