Передача файлов в другое ядро ​​asp. net webapi из другого webapi - PullRequest
0 голосов
/ 15 февраля 2020

Существующее asp. net ядро ​​Api выглядит следующим образом

public async Task<IActionResult> UploadAsync()
{
    IFormFile file = null;

    var files = Request.Form.Files;
    if (files.Count > 0)
    {
        file = Request.Form.Files[0];

        var fileText = new StringBuilder();
        using (var reader = new StreamReader(file.OpenReadStream()))
        {
            while (reader.Peek() >= 0)
                fileText.AppendLine(reader.ReadLine());
        }
        int stagingDetailId = await _stagingMarketProvider.GetV1StagingStatusDetailId();


        var result = await SaveStagingMarketsAsync(_fileProvider.ReadImportedMarkets(fileText.ToString()));

        return Ok(result);
    }

    return Ok();

}

Теперь, чтобы использовать этот API из другого asp. net ядра webapi, я должен передать эти файлы через Только объект запроса, я не могу изменить существующий код API из-за бизнеса.

1 Ответ

0 голосов
/ 15 февраля 2020

Решение 1: применимо, если вы хотите, чтобы ваш клиент перенаправлялся на другой API

При условии, что вызывающий API понимает HTTP 302 и может действовать соответственно, 302 redirect должен помочь вам .

public IActionResult Post()
{
    return Redirect("http://file-handler-api/action");
}

Из документации метод Redirect возвращает клиенту 302 или 301 ответ.

Решение 2: C# Код для публикации файла с использованием HttpClient

Ниже c# код от этого сообщения в блоге . Это простой код, который создает объект HttpClient и пытается отправить файл в веб-API.

Поскольку вы делаете это от одного API к другому, вам придется сначала сохранить файл во временном местоположении. Это временное местоположение будет параметром этого метода.

Кроме того, после загрузки вы можете удалить файл, если он не требуется. Этот закрытый метод вы можете вызвать после завершения загрузки файла в ваш первый API.

private async Task<string> UploadFile(string filePath)
{
    _logger.LogInformation($"Uploading a text file [{filePath}].");
    if (string.IsNullOrWhiteSpace(filePath))
    {
        throw new ArgumentNullException(nameof(filePath));
    }

    if (!File.Exists(filePath))
    {
        throw new FileNotFoundException($"File [{filePath}] not found.");
    }
    using var form = new MultipartFormDataContent();
    using var fileContent = new ByteArrayContent(await File.ReadAllBytesAsync(filePath));
    fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
    form.Add(fileContent, "file", Path.GetFileName(filePath));
    form.Add(new StringContent("789"), "userId");
    form.Add(new StringContent("some comments"), "comment");
    form.Add(new StringContent("true"), "isPrimary");

    var response = await _httpClient.PostAsync($"{_url}/api/files", form);
    response.EnsureSuccessStatusCode();
    var responseContent = await response.Content.ReadAsStringAsync();
    var result = JsonSerializer.Deserialize<FileUploadResult>(responseContent);
    _logger.LogInformation("Uploading is complete.");
    return result.Guid;
}

Надеюсь, это поможет вам.

...