C# 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

我对.NETCore1.0和WebAPI有问题。我想做一个简单的控制器,它将进入PUT方法的数据流转发到另一个REST服务,而不需要将这些数据存储在内存中。 在经典ASP.NET WebAPI中,使用以下代码执行此操作没有问题:



    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,这会消耗内存,所以这不是一个选项。