From 17514aae82173b1d38aad8a0f4779a14b06e7855 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 5 Apr 2021 20:37:40 +0800 Subject: [PATCH] Try to set Position to 0 in RequestPayloadBuilder. --- .../AbpRemoteStreamContentModelBinder.cs | 7 ---- .../DynamicProxying/RequestPayloadBuilder.cs | 36 +++++++++---------- .../RemoteStreamContentTestController.cs | 6 ++-- ...RemoteStreamContentTestController_Tests.cs | 8 +++-- 4 files changed, 27 insertions(+), 30 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/AbpRemoteStreamContentModelBinder.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/AbpRemoteStreamContentModelBinder.cs index 8b7264fef0..da58641d7e 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/AbpRemoteStreamContentModelBinder.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/AbpRemoteStreamContentModelBinder.cs @@ -115,13 +115,6 @@ namespace Volo.Abp.AspNetCore.Mvc.ContentFormatters } } } - else - { - postedFiles.Add(new RemoteStreamContent(request.Body) - { - ContentType = request.ContentType - }); - } } } } diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/RequestPayloadBuilder.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/RequestPayloadBuilder.cs index 8532f02c7c..1096fa971e 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/RequestPayloadBuilder.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/RequestPayloadBuilder.cs @@ -53,17 +53,7 @@ namespace Volo.Abp.Http.Client.DynamicProxying return null; } - if (value is IRemoteStreamContent remoteStreamContent) - { - var content = new StreamContent(remoteStreamContent.GetStream()); - content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(remoteStreamContent.ContentType); - content.Headers.ContentLength = remoteStreamContent.ContentLength; - return content; - } - else - { - return new StringContent(jsonSerializer.Serialize(value), Encoding.UTF8, MimeTypes.Application.Json); - } + return new StringContent(jsonSerializer.Serialize(value), Encoding.UTF8, MimeTypes.Application.Json); } private static HttpContent GenerateFormPostData(ActionApiDescriptionModel action, IReadOnlyDictionary methodArguments) @@ -80,7 +70,7 @@ namespace Volo.Abp.Http.Client.DynamicProxying if (parameters.Any(x => x.BindingSourceId == ParameterBindingSources.FormFile)) { - var postDataBuilder = new MultipartFormDataContent(); + var formData = new MultipartFormDataContent(); foreach (var parameter in parameters) { var value = HttpActionParameterHelper.FindParameterValue(methodArguments, parameter); @@ -91,32 +81,42 @@ namespace Volo.Abp.Http.Client.DynamicProxying if (value is IRemoteStreamContent remoteStreamContent) { - var streamContent = new StreamContent(remoteStreamContent.GetStream()); + var stream = remoteStreamContent.GetStream(); + if (stream.CanSeek) + { + stream.Position = 0; + } + var streamContent = new StreamContent(stream); if (!remoteStreamContent.ContentType.IsNullOrWhiteSpace()) { streamContent.Headers.ContentType = new MediaTypeHeaderValue(remoteStreamContent.ContentType); } - postDataBuilder.Add(streamContent, parameter.Name, parameter.Name); + formData.Add(streamContent, parameter.Name, parameter.Name); } else if (value is IEnumerable remoteStreamContents) { foreach (var content in remoteStreamContents) { - var streamContent = new StreamContent(content.GetStream()); + var stream = content.GetStream(); + if (stream.CanSeek) + { + stream.Position = 0; + } + var streamContent = new StreamContent(stream); if (!content.ContentType.IsNullOrWhiteSpace()) { streamContent.Headers.ContentType = new MediaTypeHeaderValue(content.ContentType); } - postDataBuilder.Add(streamContent, parameter.Name, parameter.Name); + formData.Add(streamContent, parameter.Name, parameter.Name); } } else { - postDataBuilder.Add(new StringContent(value.ToString(), Encoding.UTF8), parameter.Name); + formData.Add(new StringContent(value.ToString(), Encoding.UTF8), parameter.Name); } } - return postDataBuilder; + return formData; } else { diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentTestController.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentTestController.cs index 15491f9b21..e74c9d52e8 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentTestController.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentTestController.cs @@ -25,11 +25,11 @@ namespace Volo.Abp.AspNetCore.Mvc.ContentFormatters [HttpPost] [Route("Upload")] - public async Task UploadAsync([FromBody]IRemoteStreamContent streamContent) + public async Task UploadAsync(IRemoteStreamContent file) { - using (var reader = new StreamReader(streamContent.GetStream())) + using (var reader = new StreamReader(file.GetStream())) { - return await reader.ReadToEndAsync() + ":" + streamContent.ContentType; + return await reader.ReadToEndAsync() + ":" + file.ContentType; } } } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentTestController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentTestController_Tests.cs index 3d49a5b3ff..12745da732 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentTestController_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ContentFormatters/RemoteStreamContentTestController_Tests.cs @@ -1,5 +1,6 @@ using System.IO; using System.Net.Http; +using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; using Shouldly; @@ -25,8 +26,11 @@ namespace Volo.Abp.AspNetCore.Mvc.ContentFormatters var memoryStream = new MemoryStream(); await memoryStream.WriteAsync(Encoding.UTF8.GetBytes("UploadAsync")); memoryStream.Position = 0; - requestMessage.Content = new StreamContent(memoryStream); - requestMessage.Content.Headers.Add("Content-Type", "application/rtf"); + + var streamContent = new StreamContent(memoryStream); + streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/rtf"); + + requestMessage.Content = new MultipartFormDataContent {{streamContent, "file", "file"}}; var response = await Client.SendAsync(requestMessage);