You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ABP框架如何移除Swagger中显示的应用层API

问题描述

使用ABP框架创建项目后,运行Swagger时发现应用层的方法被识别为API并展示出来,希望移除这些内容。

应用层代码

public class UserService : AdminSSOAppService, ITransientDependency, IValidationEnabled, IUserService
{
    IUserRepository _userRepository;
    private readonly ILogger<UserService> _log;

    public UserService(IUserRepository userRepository,
        ILogger<UserService> log
        )
    {
        _userRepository = userRepository;
        _log = log;
    }

    public async Task<List<UserDto>> GetList()
    {
        var list = await _userRepository.GetListAsync();
        return ObjectMapper.Map<List<User>, List<UserDto>>(list);
    }

    public async Task<UserDto> GetUserById(int Id)
    {
        var user = await _userRepository.GetAsync(c=>c.Id == Id);
        return ObjectMapper.Map<User, UserDto>(user);
    }
}

HttpApi层代码

[Area(AdminSSORemoteServiceConsts.ModuleName)]
[RemoteService(Name = AdminSSORemoteServiceConsts.RemoteServiceName)]
[Route("api/user/user-profile")]
public class UserController : ControllerBase, IUserService
{
    private readonly IUserService _userAppService;
    public UserController(IUserService userAppService)
    {
        _userAppService = userAppService;
    }
    [HttpGet]
    [Route("get-list-httpapi")]
    public Task<List<UserDto>> GetList()
    {
        return _userAppService.GetList();
    }
    [HttpGet]
    [Route("get-by-id-httpapi")]
    public Task<UserDto> GetUserById(int Id)
    {
        return _userAppService.GetUserById(Id);
    }
}

解决方案

问题根源是ABP默认会将实现IRemoteService的服务(包括应用层服务)注册为远程服务,进而被Swagger扫描到。以下是几种解决方式:

方法1:给应用层服务添加[RemoteService(false)]特性

直接在应用层服务类或其接口上添加该特性,标记其不作为远程服务暴露:

// 在UserService类上添加
[RemoteService(false)]
public class UserService : AdminSSOAppService, ITransientDependency, IValidationEnabled, IUserService
{
    // 原有代码不变
}

或者在接口上添加:

[RemoteService(false)]
public interface IUserService
{
    Task<List<UserDto>> GetList();
    Task<UserDto> GetUserById(int Id);
}

方法2:在模块配置中排除应用层程序集

在HttpApi模块类(如AdminSSOHttpApiModule)的ConfigureServices方法中,配置AbpApiExplorerOptions只包含HttpApi层程序集:

public override void ConfigureServices(ServiceConfigurationContext context)
{
    // 其他配置代码...

    Configure<AbpApiExplorerOptions>(options =>
    {
        // 移除应用层程序集,避免被Swagger扫描
        options.Assemblies.Remove(typeof(UserService).Assembly);
        // 确保只包含HttpApi层的控制器程序集
        options.Assemblies.Add(typeof(UserController).Assembly);
    });
}

方法3:配置Swagger仅扫描HttpApi层程序集

在Swagger配置中,通过DocInclusionPredicate过滤非HttpApi层的API:

services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo { Title = "AdminSSO API", Version = "v1" });
    // 加载HttpApi层的XML注释(可选)
    options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "YourProject.HttpApi.xml"));

    // 仅包含HttpApi层控制器的API
    options.DocInclusionPredicate((docName, apiDesc) =>
    {
        var controllerAssembly = apiDesc.ActionDescriptor.RouteValues["controller"]?
            .GetType().Assembly.GetName().Name;
        return controllerAssembly == "YourProject.HttpApi";
    });
});

补充说明

优先推荐方法1,操作简单且针对性强;如果有大量应用层服务需要处理,可选择方法2或3批量配置。

内容的提问来源于stack exchange,提问作者Nguyen Duy Anh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:35:31