From a04805a6077fa3150424c4439edcb009c655b371 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 11 Apr 2020 17:10:23 +0800 Subject: [PATCH] Filter ProducesResponseType. --- .../AbpRemoteServiceApiDescriptionProvider.cs | 22 ++++++++++--------- .../Volo/Abp/Reflection/ReflectionHelper.cs | 17 ++++++++++++++ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpRemoteServiceApiDescriptionProvider.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpRemoteServiceApiDescriptionProvider.cs index 1714d74e65..ae09573d60 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpRemoteServiceApiDescriptionProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpRemoteServiceApiDescriptionProvider.cs @@ -3,7 +3,6 @@ using System.Linq; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.ApiExplorer; -using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.Extensions.Options; @@ -42,9 +41,18 @@ namespace Volo.Abp.AspNetCore.Mvc.ApiExploring { foreach (var apiResponseType in GetApiResponseTypes()) { - foreach (var result in context.Results.Where(x => ShouldAddResponseTypes(x.ActionDescriptor))) + foreach (var result in context.Results.Where(x => IsRemoteService(x.ActionDescriptor))) { - result.SupportedResponseTypes.AddIfNotContains(x => x.StatusCode == apiResponseType.StatusCode, () => apiResponseType); + var actionProducesResponseTypeAttributes = + ReflectionHelper.GetAttributesOfMemberOrDeclaringType( + result.ActionDescriptor.GetMethodInfo()); + if (actionProducesResponseTypeAttributes.Any(x => x.StatusCode == apiResponseType.StatusCode)) + { + continue; + } + + result.SupportedResponseTypes.AddIfNotContains(x => x.StatusCode == apiResponseType.StatusCode, + () => apiResponseType); } } } @@ -77,14 +85,8 @@ namespace Volo.Abp.AspNetCore.Mvc.ApiExploring return _options.SupportedResponseTypes; } - protected virtual bool ShouldAddResponseTypes(ActionDescriptor actionDescriptor) + protected virtual bool IsRemoteService(ActionDescriptor actionDescriptor) { - if (ReflectionHelper.GetSingleAttributeOfMemberOrDeclaringTypeOrDefault(actionDescriptor.GetMethodInfo()) != null || - ReflectionHelper.GetSingleAttributeOfMemberOrDeclaringTypeOrDefault(actionDescriptor.GetMethodInfo()) != null) - { - return false; - } - var remoteServiceAttr = ReflectionHelper.GetSingleAttributeOfMemberOrDeclaringTypeOrDefault(actionDescriptor.GetMethodInfo()); return remoteServiceAttr != null && remoteServiceAttr.IsEnabled; } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/ReflectionHelper.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/ReflectionHelper.cs index 8d6e6a42cf..fd47d8b859 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/ReflectionHelper.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Reflection/ReflectionHelper.cs @@ -108,6 +108,23 @@ namespace Volo.Abp.Reflection ?? defaultValue; } + /// + /// Tries to gets attributes defined for a class member and it's declaring type including inherited attributes. + /// + /// Type of the attribute + /// MemberInfo + /// Inherit attribute from base classes + public static IEnumerable GetAttributesOfMemberOrDeclaringType(MemberInfo memberInfo, bool inherit = true) + where TAttribute : class + { + var customAttributes = memberInfo.GetCustomAttributes(true).OfType(); + var declaringTypeCustomAttributes = + memberInfo.DeclaringType?.GetTypeInfo().GetCustomAttributes(true).OfType(); + return declaringTypeCustomAttributes != null + ? customAttributes.Concat(declaringTypeCustomAttributes).Distinct() + : customAttributes; + } + /// /// Gets value of a property by it's full path from given object ///