Browse Source

Check whether the controller implements the IRemoteService interface.

Resolve #7920
pull/7921/head
maliming 5 years ago
parent
commit
706986715c
  1. 34
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpRemoteServiceApiDescriptionProvider.cs

34
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpRemoteServiceApiDescriptionProvider.cs

@ -3,6 +3,7 @@ using System.Linq;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
@ -19,7 +20,7 @@ namespace Volo.Abp.AspNetCore.Mvc.ApiExploring
public AbpRemoteServiceApiDescriptionProvider( public AbpRemoteServiceApiDescriptionProvider(
IModelMetadataProvider modelMetadataProvider, IModelMetadataProvider modelMetadataProvider,
IOptions<MvcOptions> mvcOptionsAccessor, IOptions<MvcOptions> mvcOptionsAccessor,
IOptions<AbpRemoteServiceApiDescriptionProviderOptions> optionsAccessor) IOptions<AbpRemoteServiceApiDescriptionProviderOptions> optionsAccessor)
{ {
_modelMetadataProvider = modelMetadataProvider; _modelMetadataProvider = modelMetadataProvider;
@ -41,7 +42,7 @@ namespace Volo.Abp.AspNetCore.Mvc.ApiExploring
{ {
foreach (var apiResponseType in GetApiResponseTypes()) foreach (var apiResponseType in GetApiResponseTypes())
{ {
foreach (var result in context.Results.Where(x => IsRemoteService(x.ActionDescriptor))) foreach (var result in context.Results.Where(IsRemoteService))
{ {
var actionProducesResponseTypeAttributes = var actionProducesResponseTypeAttributes =
ReflectionHelper.GetAttributesOfMemberOrDeclaringType<ProducesResponseTypeAttribute>( ReflectionHelper.GetAttributesOfMemberOrDeclaringType<ProducesResponseTypeAttribute>(
@ -62,7 +63,7 @@ namespace Volo.Abp.AspNetCore.Mvc.ApiExploring
foreach (var apiResponse in _options.SupportedResponseTypes) foreach (var apiResponse in _options.SupportedResponseTypes)
{ {
apiResponse.ModelMetadata = _modelMetadataProvider.GetMetadataForType(apiResponse.Type); apiResponse.ModelMetadata = _modelMetadataProvider.GetMetadataForType(apiResponse.Type);
foreach (var responseTypeMetadataProvider in _mvcOptions.OutputFormatters.OfType<IApiResponseTypeMetadataProvider>()) foreach (var responseTypeMetadataProvider in _mvcOptions.OutputFormatters.OfType<IApiResponseTypeMetadataProvider>())
{ {
var formatterSupportedContentTypes = responseTypeMetadataProvider.GetSupportedContentTypes(null, apiResponse.Type); var formatterSupportedContentTypes = responseTypeMetadataProvider.GetSupportedContentTypes(null, apiResponse.Type);
@ -85,10 +86,29 @@ namespace Volo.Abp.AspNetCore.Mvc.ApiExploring
return _options.SupportedResponseTypes; return _options.SupportedResponseTypes;
} }
protected virtual bool IsRemoteService(ActionDescriptor actionDescriptor) protected virtual bool IsRemoteService(ApiDescription actionDescriptor)
{ {
var remoteServiceAttr = ReflectionHelper.GetSingleAttributeOfMemberOrDeclaringTypeOrDefault<RemoteServiceAttribute>(actionDescriptor.GetMethodInfo()); if (actionDescriptor.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor)
return remoteServiceAttr != null && remoteServiceAttr.IsEnabled; {
var remoteServiceAttr = ReflectionHelper.GetSingleAttributeOfMemberOrDeclaringTypeOrDefault<RemoteServiceAttribute>(controllerActionDescriptor.MethodInfo);
if (remoteServiceAttr != null && remoteServiceAttr.IsEnabled)
{
return true;
}
remoteServiceAttr = ReflectionHelper.GetSingleAttributeOfMemberOrDeclaringTypeOrDefault<RemoteServiceAttribute>(controllerActionDescriptor.ControllerTypeInfo);
if (remoteServiceAttr != null && remoteServiceAttr.IsEnabled)
{
return true;
}
if (typeof(IRemoteService).IsAssignableFrom(controllerActionDescriptor.ControllerTypeInfo))
{
return true;
}
}
return false;
} }
} }
} }

Loading…
Cancel
Save