WebApi转发流到其他服务

时间:2016-09-14 21:06:13

标签: c# .net rest asp.net-core asp.net-core-webapi

我遇到.NET Core 1.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();
                }

            }
        }

但是在.NET Core 1.0 ASP.NET WebAPI上我收到错误,说流已经被消耗了。下面我附上了.NET核心代码。我想我已经尝试过所有的东西,但我仍然遇到这个错误。 它是.NET Core的错误或功能,我必须以不同的方式进行吗?



    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();
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

您可以尝试在using中初始化有效负载:

    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();
                    }
                }
            }
        }
    }