Ior*_*nev 3 c# asp.net-web-api
这是我的情况我有两个web api服务.第一个有一个处理某些数据的方法,当部分数据准备就绪时,它会将它推送到流中.
public HttpResponseMessage Get( )
{
var response = Request.CreateResponse( );
response.Content = new PushStreamContent( WriteToStream );
return response;
}
public async void WriteToStream( Stream outputStream, HttpContent content, TransportContext context )
{
.......
}
Run Code Online (Sandbox Code Playgroud)
第二个web api在控制器中有一个调用第一个web api的方法.它必须从流中读取部分,然后将其放入自己的流中:
public HttpResponseMessage Get( )
{
Stream stream = null;
using( HttpClient httpClient = new HttpClient( ) )
{
httpClient.Timeout = TimeSpan.FromMilliseconds( Timeout.Infinite );
HttpRequestMessage request = new HttpRequestMessage( HttpMethod.Get, "http://localhost/fistWebApi/" );
var response = httpClient.SendAsync( request, HttpCompletionOption.ResponseContentRead );
var content = response.Result.Content.ReadAsStreamAsync( );
stream = content.Result;
}
var msg = Request.CreateResponse( );
msg.Content = new PushStreamContent( WriteToStream );
return msg;
}
public async void WriteToStream( Stream outputStream, HttpContent content, TransportContext context )
{
.......
}
Run Code Online (Sandbox Code Playgroud)
问题是我不知道如何同步调用SendAsync ReadAsStreamAsync.现在它不等待,并且stream在尝试使用它时没有正确初始化.我希望第二种方法的代码等到第一种方法将部分数据放在流上.我尝试使用ContinueWith但是后来我无法做到.如果有任何问题我会尝试更深入地解释,我知道这是一个模糊的解释.
Dar*_*ler 10
试试这个...
public HttpResponseMessage Get()
{
using (HttpClient httpClient = new HttpClient())
{
httpClient.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://www.google.ca");
return httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead)
.ContinueWith((t) =>
{
return new HttpResponseMessage()
{
Content = t.Result.Content
};
}).Result;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码适合我.这样做的缺点是,因为您使用HttpCompletionOption.ResponseContentRead来自远程服务的整个有效负载将被缓冲,然后将其返回给您的客户端.
相反,如果您使用HttpCompletionOption.ResponseHeadersRead,t.Result.Content 则会返回网络流.这样,当您的客户端拉出响应流时,它将直接从远程资源流式传输.我假设你正在尝试使用你正在返回的PushStreamContent.