C# WebApi将流转发到其他服务
我对.NETCore1.0和WebAPI有问题。我想做一个简单的控制器,它将进入PUT方法的数据流转发到另一个REST服务,而不需要将这些数据存储在内存中。 在经典ASP.NET WebAPI中,使用以下代码执行此操作没有问题:C# WebApi将流转发到其他服务,c#,.net,rest,asp.net-core,asp.net-core-webapi,C#,.net,Rest,Asp.net Core,Asp.net Core Webapi,我对.NETCore1.0和WebAPI有问题。我想做一个简单的控制器,它将进入PUT方法的数据流转发到另一个REST服务,而不需要将这些数据存储在内存中。 在经典ASP.NET WebAPI中,使用以下代码执行此操作没有问题: public async Task Put(string id) { var fileContent = this.Request.Content; using (var handler = new HttpClien
public async Task Put(string id)
{
var fileContent = this.Request.Content;
using (var handler = new HttpClientHandler() { Credentials = new NetworkCredential("XXX", "XXX") })
{
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(@"http://X.X.X.X/documents");
var response =
await client.PutAsync(string.Format("?uri={0}.xml", id), fileContent);
if (response.IsSuccessStatusCode)
{
Created("urltocontent", "empty");
}
else
{
BadRequest();
}
}
}
但是在.NETCore1.0ASP.NETWebAPI上,我得到一个错误,说流已经被消耗了。下面我附上了.NET核心代码。我想我已经试过了所有的方法,但是我仍然会犯这个错误。
这是一个bug还是.NETCore的特性,我必须用不同的方式来做
public async Task Put(string id)
{
Stream fileContent = Request.Body;
using (var handler = new HttpClientHandler() { Credentials = new NetworkCredential("XXX", "XXX") })
{
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(@"http://X.X.X.X/documents");
var payload = new StreamContent(fileContent);
var response =
await client.PutAsync(string.Format("?uri={0}.xml", id), payload);
if (response.IsSuccessStatusCode)
{
Created("urltocontent", null);
}
else
{
BadRequest();
}
}
}
}
您是否可以尝试使用初始化
内的有效负载:
public async Task Put(string id)
{
Stream fileContent = Request.Body;
using (var handler = new HttpClientHandler() { Credentials = new NetworkCredential("XXX", "XXX") })
{
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(@"http://X.X.X.X/documents");
using (var payload = new StreamContent(fileContent))
{
var response =
await client.PutAsync(string.Format("?uri={0}.xml", id), payload);
if (response.IsSuccessStatusCode)
{
Created("urltocontent", null);
}
else
{
BadRequest();
}
}
}
}
}
您是否可以尝试使用
初始化内的有效负载:
public async Task Put(string id)
{
Stream fileContent = Request.Body;
using (var handler = new HttpClientHandler() { Credentials = new NetworkCredential("XXX", "XXX") })
{
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(@"http://X.X.X.X/documents");
using (var payload = new StreamContent(fileContent))
{
var response =
await client.PutAsync(string.Format("?uri={0}.xml", id), payload);
if (response.IsSuccessStatusCode)
{
Created("urltocontent", null);
}
else
{
BadRequest();
}
}
}
}
}
默认情况下,请求正文流只能读取一次。如果已经读过了,那么还有别的东西在读。如果您没有在查询字符串中指定id
,那么该绑定将读取查找id
(我认为)的主体。尝试将[FromQuery]
添加到参数中;如果这还不能解决问题,那么管道中前面的其他内容就是读取正文。谢谢,我已经尝试过了,但没有帮助:(一件事是,当我更改逻辑以保存此流时,请使用FileStream而不是转发它,这一切都很好。默认情况下,请求正文流只能读取一次。如果已读取,则有其他内容正在读取。如果在查询字符串中未指定id
,则该绑定将读取正文。)查找id
(我想)。尝试将[FromQuery]
添加到您的参数中;如果这不能解决问题,则管道中前面的其他内容正在读取正文。谢谢,我已经尝试了,但没有帮助:(一件事是,当我改变逻辑来保存这个流时,使用FileStream来保存磁盘,而不是转发它,一切都很好。不,这没有帮助。与此同时,我尝试使用普通的HttWebRequest,它工作了,但我不得不使用stream CopyTo,这会消耗内存,所以它不是一个选项。不,这没有帮助。同时,我我尝试过使用普通的HttWebRequest,但效果很好,但我不得不使用streamcopyto,这会消耗内存,所以这不是一个选项。