如何传递HttpInputStream的内容并将其发送到c#.net中的另一个Rest Api

问题描述 投票:3回答:1

我有一个REST API Web服务,充当中间件,将调用重定向到另一个REST API服务。

例如,在这种情况下,我在网页上传文件。此Web服务接收文件并将其发送到另一个实际处理文件的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

在写入所有字节之前无法关闭流。

为什么会这样?有没有办法解决这个问题?

c# .net rest http inputstream
1个回答
1
投票

ForwardPost函数中的using将从调用方法中释放forwardingContent。此dispose将尝试从origin方法的请求对象中释放“postingFile.InputStream”引用。这很可能与httprequest对象密切相关。

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

解决方案是将postingFile.InputStream复制到新的内存流,以便可以单独处理。

© www.soinside.com 2019 - 2024. All rights reserved.