From faf998ab53f3dc4fb7c8f2651df482b4fc437eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 10 Oct 2020 22:04:25 +0300 Subject: [PATCH] Refactored #5733 --- .../AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs | 3 -- .../AspNetCore/Mvc/AbpMvcOptionsExtensions.cs | 8 +++++ .../AspNetCoreApiDescriptionModelProvider.cs | 36 +++++++++---------- .../RemoteStreamContentInputFormatter.cs | 5 +-- .../RemoteStreamContentOutputFormatter.cs | 9 ++--- .../Volo/Abp/Content/IRemoteStreamContent.cs | 5 +-- .../Volo/Abp/Content/RemoteStreamContent.cs | 3 +- .../Content/ReferencedRemoteStreamContent.cs | 7 ++-- .../DynamicHttpProxyInterceptor.cs | 19 +++++----- .../DynamicProxying/RequestPayloadBuilder.cs | 7 +--- .../Mvc/Utils/ArrayMacther_Tests.cs | 5 ++- 11 files changed, 55 insertions(+), 52 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs index 4ac0ac5527..3097a3c725 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs @@ -38,7 +38,6 @@ using Volo.Abp.Http.Modeling; using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.UI; -using Volo.Abp.AspNetCore.Mvc.Content; namespace Volo.Abp.AspNetCore.Mvc { @@ -177,8 +176,6 @@ namespace Volo.Abp.AspNetCore.Mvc Configure(mvcOptions => { mvcOptions.AddAbp(context.Services); - mvcOptions.InputFormatters.Insert(0, new RemoteStreamContentInputFormatter()); - mvcOptions.OutputFormatters.Insert(0, new RemoteStreamContentOutputFormatter()); }); Configure(options => diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpMvcOptionsExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpMvcOptionsExtensions.cs index a2f1b1b523..9ff444001b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpMvcOptionsExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpMvcOptionsExtensions.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Auditing; +using Volo.Abp.AspNetCore.Mvc.Content; using Volo.Abp.AspNetCore.Mvc.Conventions; using Volo.Abp.AspNetCore.Mvc.ExceptionHandling; using Volo.Abp.AspNetCore.Mvc.Features; @@ -21,6 +22,13 @@ namespace Volo.Abp.AspNetCore.Mvc AddPageFilters(options); AddModelBinders(options); AddMetadataProviders(options, services); + AddFormatters(options); + } + + private static void AddFormatters(MvcOptions options) + { + options.InputFormatters.Insert(0, new RemoteStreamContentInputFormatter()); + options.OutputFormatters.Insert(0, new RemoteStreamContentOutputFormatter()); } private static void AddConventions(MvcOptions options, IServiceCollection services) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs index 9d9ab9075d..5cd1333f34 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Reflection; using System.Text; @@ -283,21 +282,21 @@ namespace Volo.Abp.AspNetCore.Mvc return; } - /* - * --- bug report --- - ArrayMatcher.Match has the following bug: - sourceArray: [ "test1", "test2", "test3" ], - destinationArray: [ "test2", "test3" ], - expectedResult: [ "test2", "test3" ], - result: [ "test1", "test1" ] - */ - /*Because of ArrayMatcher.Match bug parameters that are - * service provided by FromServicesAttribute must be excluded - * because Microsoft's API Explorer does not include them - */ - var parameterDescriptionNames = apiDescription.ParameterDescriptions.Select(p => p.Name).ToArray(); - var methodParameterNames = method.GetParameters().Where(NotServiceProvidedParam).Select(GetMethodParamName).ToArray(); - var matchedMethodParamNames = ArrayMatcher.Match(parameterDescriptionNames, methodParameterNames); + var parameterDescriptionNames = apiDescription + .ParameterDescriptions + .Select(p => p.Name) + .ToArray(); + + var methodParameterNames = method + .GetParameters() + .Where(IsNotFromServicesParameter) + .Select(GetMethodParamName) + .ToArray(); + + var matchedMethodParamNames = ArrayMatcher.Match( + parameterDescriptionNames, + methodParameterNames + ); for (var i = 0; i < apiDescription.ParameterDescriptions.Count; i++) { @@ -322,10 +321,9 @@ namespace Volo.Abp.AspNetCore.Mvc } } - private bool NotServiceProvidedParam(ParameterInfo parameterInfo) + private static bool IsNotFromServicesParameter(ParameterInfo parameterInfo) { - var fromServicesAttribute = parameterInfo.GetCustomAttribute(); - return fromServicesAttribute == null; + return !parameterInfo.IsDefined(typeof(FromServicesAttribute), true); } public string GetMethodParamName(ParameterInfo parameterInfo) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Content/RemoteStreamContentInputFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Content/RemoteStreamContentInputFormatter.cs index c135864bf8..a4f5668b7d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Content/RemoteStreamContentInputFormatter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Content/RemoteStreamContentInputFormatter.cs @@ -20,8 +20,9 @@ namespace Volo.Abp.AspNetCore.Mvc.Content public override Task ReadRequestBodyAsync(InputFormatterContext context) { - var stream = new InternalRemoteStreamContent(context.HttpContext); - return InputFormatterResult.SuccessAsync(stream); + return InputFormatterResult.SuccessAsync( + new InternalRemoteStreamContent(context.HttpContext) + ); } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Content/RemoteStreamContentOutputFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Content/RemoteStreamContentOutputFormatter.cs index b3baee3bc9..d3ecfaff27 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Content/RemoteStreamContentOutputFormatter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Content/RemoteStreamContentOutputFormatter.cs @@ -18,12 +18,13 @@ namespace Volo.Abp.AspNetCore.Mvc.Content return typeof(IRemoteStreamContent).IsAssignableFrom(type); } - public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context) + public async override Task WriteResponseBodyAsync(OutputFormatterWriteContext context) { - var httpContext = context.HttpContext; - var remoteStream = context.Object as IRemoteStreamContent; + var remoteStream = (IRemoteStreamContent)context.Object; using (var stream = remoteStream.GetStream()) - await stream.CopyToAsync(httpContext.Response.Body); + { + await stream.CopyToAsync(context.HttpContext.Response.Body); + } } } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Content/IRemoteStreamContent.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Content/IRemoteStreamContent.cs index d8ecd8b9bf..bca259d422 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Content/IRemoteStreamContent.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Content/IRemoteStreamContent.cs @@ -1,12 +1,13 @@ -using System; -using System.IO; +using System.IO; namespace Volo.Abp.Content { public interface IRemoteStreamContent { string ContentType { get; } + long? ContentLength { get; } + Stream GetStream(); } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Content/RemoteStreamContent.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Content/RemoteStreamContent.cs index 67a4f8eb2e..f217101cea 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Content/RemoteStreamContent.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Content/RemoteStreamContent.cs @@ -1,5 +1,4 @@ -using System; -using System.IO; +using System.IO; namespace Volo.Abp.Content { diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Content/ReferencedRemoteStreamContent.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Content/ReferencedRemoteStreamContent.cs index 80e4176e74..b99cec8a51 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Content/ReferencedRemoteStreamContent.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Content/ReferencedRemoteStreamContent.cs @@ -5,11 +5,12 @@ namespace Volo.Abp.Http.Client.Content { internal class ReferencedRemoteStreamContent : RemoteStreamContent { - private readonly object[] references; + private readonly object[] _references; - public ReferencedRemoteStreamContent(Stream stream, params object[] references) : base(stream) + public ReferencedRemoteStreamContent(Stream stream, params object[] references) + : base(stream) { - this.references = references; + this._references = references; } } } diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs index c0dde47603..321d538044 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs @@ -109,20 +109,19 @@ namespace Volo.Abp.Http.Client.DynamicProxying if (typeof(T) == typeof(IRemoteStreamContent)) { - /*returning a class that holds a reference to response - * content just to be sure that GC does not dispose of - * it before we finish doing our work with the stream*/ + /* returning a class that holds a reference to response + * content just to be sure that GC does not dispose of + * it before we finish doing our work with the stream */ return (T)((object)new ReferencedRemoteStreamContent(await responseContent.ReadAsStreamAsync(), responseContent)); } - else - { - var stringContent = await responseContent.ReadAsStringAsync(); - if (typeof(T) == typeof(string)) - return (T)((object)stringContent); - return JsonSerializer.Deserialize(await responseContent.ReadAsStringAsync()); + var stringContent = await responseContent.ReadAsStringAsync(); + if (typeof(T) == typeof(string)) + { + return (T)(object)stringContent; } + return JsonSerializer.Deserialize(await responseContent.ReadAsStringAsync()); } private async Task MakeRequestAsync(IAbpMethodInvocation invocation) @@ -152,7 +151,7 @@ namespace Volo.Abp.Http.Client.DynamicProxying ) ); - var response = await client.SendAsync(requestMessage, + var response = await client.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead /*this will buffer only the headers, the content will be used as a stream*/, GetCancellationToken()); 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 372d6f2921..7aacfaad02 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 @@ -7,7 +7,6 @@ using Volo.Abp.Content; using Volo.Abp.Http.Modeling; using Volo.Abp.Http.ProxyScripting.Generators; using Volo.Abp.Json; -using Volo.Abp.Reflection; namespace Volo.Abp.Http.Client.DynamicProxying { @@ -23,12 +22,8 @@ namespace Volo.Abp.Http.Client.DynamicProxying } body = GenerateFormPostData(action, methodArguments); - if (body != null) - { - return body; - } - return null; + return body; } private static HttpContent GenerateBody(ActionApiDescriptionModel action, IReadOnlyDictionary methodArguments, IJsonSerializer jsonSerializer) diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Utils/ArrayMacther_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Utils/ArrayMacther_Tests.cs index a066622748..f30dc082aa 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Utils/ArrayMacther_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Utils/ArrayMacther_Tests.cs @@ -10,7 +10,10 @@ namespace Volo.Abp.AspNetCore.Mvc.Utils new[] { "p1", "p2", "p3", "p4", "p5" }, new[] { "p1", "p2", "p2", "p2", "p3", "p4", "p5", "p5" }) ] - public void Should_Find_Correct_Items(string[] sourceArray, string[] destinationArray, string[] expectedArray) + public void Should_Find_Correct_Items( + string[] sourceArray, + string[] destinationArray, + string[] expectedArray) { var result = ArrayMatcher.Match(sourceArray, destinationArray); Assert.Equal(expectedArray, result);