Browse Source

Refactored #5733

pull/5733/head
Halil İbrahim Kalkan 6 years ago
parent
commit
faf998ab53
  1. 3
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs
  2. 8
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpMvcOptionsExtensions.cs
  3. 36
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AspNetCoreApiDescriptionModelProvider.cs
  4. 5
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Content/RemoteStreamContentInputFormatter.cs
  5. 9
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Content/RemoteStreamContentOutputFormatter.cs
  6. 5
      framework/src/Volo.Abp.Core/Volo/Abp/Content/IRemoteStreamContent.cs
  7. 3
      framework/src/Volo.Abp.Core/Volo/Abp/Content/RemoteStreamContent.cs
  8. 7
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Content/ReferencedRemoteStreamContent.cs
  9. 19
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs
  10. 7
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/RequestPayloadBuilder.cs
  11. 5
      framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Utils/ArrayMacther_Tests.cs

3
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 =>
{
mvcOptions.AddAbp(context.Services);
mvcOptions.InputFormatters.Insert(0, new RemoteStreamContentInputFormatter());
mvcOptions.OutputFormatters.Insert(0, new RemoteStreamContentOutputFormatter());
});
Configure<AbpEndpointRouterOptions>(options =>

8
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)

36
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<FromServicesAttribute>();
return fromServicesAttribute == null;
return !parameterInfo.IsDefined(typeof(FromServicesAttribute), true);
}
public string GetMethodParamName(ParameterInfo parameterInfo)

5
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<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
{
var stream = new InternalRemoteStreamContent(context.HttpContext);
return InputFormatterResult.SuccessAsync(stream);
return InputFormatterResult.SuccessAsync(
new InternalRemoteStreamContent(context.HttpContext)
);
}
}
}

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

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

3
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
{

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

19
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<T>(await responseContent.ReadAsStringAsync());
var stringContent = await responseContent.ReadAsStringAsync();
if (typeof(T) == typeof(string))
{
return (T)(object)stringContent;
}
return JsonSerializer.Deserialize<T>(await responseContent.ReadAsStringAsync());
}
private async Task<HttpContent> 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());

7
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<string, object> methodArguments, IJsonSerializer jsonSerializer)

5
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);

Loading…
Cancel
Save