Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web api方法调用另一个流内容Web api方法?_C#_Asp.net Web Api - Fatal编程技术网

C# Web api方法调用另一个流内容Web api方法?

C# Web api方法调用另一个流内容Web api方法?,c#,asp.net-web-api,C#,Asp.net Web Api,以下是我的情况,我有两个web api服务。第一种方法有一个处理某些数据的方法,当部分数据准备就绪时,它将其推送到流中 public HttpResponseMessage Get( ) { var response = Request.CreateResponse( ); response.Content = new PushStreamContent( WriteToStream ); return re

以下是我的情况,我有两个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的方法。它必须读取流中的部分,并对其进行处理,然后将i放入它自己的流中:

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
。现在它不再等待,并且在尝试使用它时,
未正确初始化。我希望第二个方法的代码等待,直到第一个方法将部分数据放到流中。我试着使用
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执行此操作。

是否也应该通过将状态代码传递给构造函数来转发状态代码?ie:新的HttpResponseMessage(t.result.StatusCode)@eventualEntropy是的。并将标题复制到上面。并通过使方法异步来摆脱那些讨厌的.Result调用。这段代码错得太多了。答案很好,我在两个API之间构建了一种“代理”,我正在努力找到一种方法来传输大文件,而不在RAM中缓冲整个文件,这就是解决方案!我发现了一个重要的注意事项:如果在Web Api自宿主项目中使用此选项,请确保同时延长
HttpSelfHostConfiguration
对象的超时时间,否则持续时间超过60秒的请求将失败。下载大内容时,会产生网络错误。