我有一个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
在写入所有字节之前无法关闭流。
为什么会这样?有没有办法解决这个问题?
ForwardPost函数中的using将从调用方法中释放forwardingContent。此dispose将尝试从origin方法的请求对象中释放“postingFile.InputStream”引用。这很可能与httprequest对象密切相关。
using (var response = await client.PostAsync(url, forwardContent))
解决方案是将postingFile.InputStream复制到新的内存流,以便可以单独处理。