Как передать содержимое HttpInputStream и отправить его другому Rest Api в c # .net - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть веб-служба API REST, которая действует как промежуточное ПО, которое перенаправляет вызовы на другую службу API REST.

Например, в этом случае я загружаю файл на веб-страницу.И этот веб-сервис получает файлы и отправляет их другому API, который на самом деле обрабатывает файлы.

Это что-то вроде этого:

public async Task<IHttpActionResult> ExecuteFileUpload()
{
    IHttpActionResult res;
    try
    {
        var httpRequest = HttpContext.Current.Request;
        var requestedFiles = new List<System.IO.Stream>();
        var url = "http://localhost:2288" + "/api/v1/templates/upload";
        if (httpRequest.Files.Count > 0)
        {
            HttpFileCollection files = httpRequest.Files;
            using (var content = new MultipartFormDataContent())
            {
                int index = 0;
                foreach (var file in httpRequest.Files)
                {
                    var postedFile = httpRequest.Files[index];
                    var fileName = postedFile.FileName;
                    var fileInMemory = postedFile.InputStream;
                    content.Add(new StreamContent(fileInMemory), "f" + index, fileName);
                    index++;
                }
                res = await ForwardPost(url, content);
            }
        }
        else
            res = BadRequest();
    }
    catch (Exception ex)
    {
        res = InternalServerError(ex);
    }
    return res;
}

Функция пересылки сообщений очень проста:

protected async Task<IHttpActionResult> ForwardPost(string url, MultipartFormDataContent forwardContent)
{
    IHttpActionResult res;
    using (var client = CreateClient())
    {
        using (var response = await client.PostAsync(url, forwardContent))
        {
            if (response.StatusCode == HttpStatusCode.OK)
            {
                var content = await response.Content.ReadAsAsync<JToken>();
                res = Ok(content);
            }
            else
            {
                res = InternalServerError();
            }
        }

        return res;
    }
}

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

Однако это вызывает исключение дляэта строка:

response = await client.PostAsync(url, forwardContent)

Выдает исключение System.IO.IOException

Невозможно закрыть поток, пока не будут записаны все байты.

Почему этодело?Есть ли способ решить эту проблему?

1 Ответ

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

Использование в функции ForwardPost избавит forwardedContent от вызывающего метода.Эта утилита будет пытаться избавиться от ссылки «postsFile.InputStream» из объекта запроса метода источника.Скорее всего, это тесно связано с объектом httprequest.

using (var response = await client.PostAsync(url, forwardContent))

Решение состоит в том, чтобы скопировать postsFile.InputStream в новый поток памяти таким образом, чтобы он мог быть расположен отдельно.

...