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

Posted

技术标签:

【中文标题】如何传递 HttpInputStream 的内容并将其发送到 c# .net 中的另一个 Rest Api【英文标题】:How to pass on the content of a HttpInputStream and send it to another Rest Api in c# .net 【发布时间】:2019-07-08 23:01:56 【问题描述】:

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

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

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

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

【问题讨论】:

在将postedFile.InputStream 添加到新的MultipartFormDataContent 之前,尝试将其复制到新的内存流中。 我试图这样做。但是它导致我发送的内容变成了 0 字节文件。我最终做了类似的事情:将其读入字节数组并将其加载回内存流。但是我真的对错误消息感到困惑。因为在任何情况下我都试图关闭流。我希望我可以通过流。这种方式尤其是当我尝试上传更大尺寸的文件时,它不会占用内存。 true,它会占用您系统上的一些内存。可能有一种方法可以更直接地处理请求对象,这样您就可以在完成第一个请求后处理您的第二个请求。而不是直接在 ForwardPost 方法中 【参考方案1】:

ForwardPost 函数中的 using 将从调用方法中释放 forwardedContent。此处置将尝试从源方法的请求对象处置“postedFile.InputStream”引用。这可能与 httprequest 对象密切相关。

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

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

【讨论】:

以上是关于如何传递 HttpInputStream 的内容并将其发送到 c# .net 中的另一个 Rest Api的主要内容,如果未能解决你的问题,请参考以下文章

类型“System.Web.HttpInputStream”未标记为可序列化

如何将指针传递给字符串,指向子字符串的指针,并返回其他内容?

如何传递值并显示标题列表?

如何将一个反应组件传递给另一个反应组件以包含第一个组件的内容?

如何将 NSArray 传递给 JavaScript 文件并在 JavaScript 中打印该数组?

asp中怎么给include的内容传递参数