Web api方法调用另一个流内容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 )
        {
            .......
        }

第二个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,你正在返回

最新更新