这是我的情况,我有两个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 )
{
.......
}
第二个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 )
{
.......
}
问题是我不知道如何同步呼叫SendAsync
ReadAsStreamAsync
。现在它不等待和stream
是不正确初始化时,试图使用它。我想让第二个方法的代码等到第一个方法把数据的一部分放在流上。我尝试使用ContinueWith
,但后来我无法做到这一点。我知道这个解释有点模糊,如果有任何问题,我会尽量解释得更深入。
试试这个…
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;
}
}
上面的代码为我工作。这样做的缺点是,因为您使用了HttpCompletionOption.ResponseContentRead
,来自远程服务的整个有效负载将在返回给客户端之前被缓冲。
如果你使用HttpCompletionOption.ResponseHeadersRead
, t.Result.Content
将返回一个网络流。这样,当您的客户端提取响应流时,它将直接来自远程资源。我假设这就是你目前正在尝试做的PushStreamContent,你正在返回