添加新的应用程序服务时,Swagger崩溃?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (147)

在你阅读这篇文章之前,知道我已经看过这个帖子了......问题几乎是一样的,我已经尝试了解决方案。所以这篇文章不重复。

我们使用ASP.NET Boilerplate启动模板。我们开发了一些应用服务,其结构如下:

public interface IFooAppService : 
    IAsyncCrudAppService<FooDto, Guid, GetAllFooDto, CreateFooDto, UpdateFooDto>
    // Abp.Application.Services.IAsyncCrudAppService<...>
{
}

[AbpAuthorize("Authorize.Foo")]
public class FooAppService : 
    AsyncCrudAppService<Foo, FooDto, Guid, FooFilterInput, CreateFooDto, FooDto>,
    IFooAppService
{
    private readonly BarManager _barManager;
    public FooAppService(IBarManager barManager, IRepository<Foo, Guid> repository)
        : base (repository)
    {
        _barManager = barManager;
    }

    public override async Task<FooDto> Create(CreateFooDto input)
    {
        // create with repository
    }

    // other overridden Actions and Foo interface implementation
}

一切都与此处提供的文档一致。

所有方法都运行良好,我可以使用所有Swagger功能。配置似乎没问题(我们为ABP注入一些后JavaScript,......)等。

最初,我有以下版本:

  • Microsoft.AspNetCore: 2.0.1
  • Microsoft.EntityFrameworkCore: 2.0.1
  • Abp.AspNetCore: 3.6.2
  • Swashbuckle.AspNetCore: 1.1.0

我们有385个 API。

我添加了一个新的AppService,承诺,其经理,Dtos等。

那一刻,当我开始并且我大摇大摆时,我的浏览器崩溃并显示一条消息,询问我是否要停止脚本(IE,Edge,Firefox,Chrome,...)。

在调试模式下,我没有关于可能抛出的异常的信息。

尝试:

  1. 更新Swashbuckle.AspNetCoreNuGet包(所有版本:1.2,2.x和3.0.0)
    • 在版本1.X中,我遇到了同样的问题。
    • 在2.5版中,UI不显示。
    • 在其他版本中,UI显示,我可以使用除我的新方法之外的所有方法,承诺。当我点击悬停他时,我只有微调器...浏览器冻结并问我是否要停止脚本或等待。

在Chrome上,Chrome引发错误:

  1. 删除已覆盖的承诺方法

如果我的代码在重写方法中是错误的。

[AbpAuthorize("Authorize.Commitments")]
public class CommitmentAppService : 
    AsyncCrudAppService<Commitment, CommitmentDto, Guid, CommitmentFilterInput, CreateCommitmentDto, UpdateCommitmentDto>,
    ICommitmentAppService
{
    private readonly ICommitmentManager _commitmentManager;
    private readonly IFundManager _fooManager;
    private readonly ILimitedPartnerManager _barManager;

    public CommitmentAppService(
        ICommitmentManager commitmentManager,
        IFooManager fooManager,
        IBarManager barManager,
        IOneRepository<Commitment, Guid> repository)
        : base(repository)
    {
        _commitmentManager = commitmentManager;
        _fooManager = fooManager;
        _barManager = barManager;
        _commitmentManager = commitmentManager;
    }
    // nothing here
}

结果相同。

  1. 仅使用一个DTO(CommitmentDto)而不是一组DTOs CommitmentDto,CreateCommitmentDto,UpdateCommitmentDto,...
    • AsyncCrudAppService<Commitment, CommitmentDto, Guid> 其中定义了实体,其DTO和PK类型
    • AsyncCrudAppService<Commitment, CommitmentDto, Guid, CommitmentFilterInput> 其中定义了实体,其默认DTO,PK类型和过滤器输入DTO
    • AsyncCrudAppService<Commitment, CommitmentDto, Guid, CommitmentFilterInput, CommitmentDto> 其中定义了实体,其默认DTO,PK类型,过滤器输入DTO和创建实体DTO
    • AsyncCrudAppService<Commitment, CommitmentDto, Guid, CommitmentFilterInput, CommitmentDto, CommitmentDto> 其中定义了实体,其默认DTO,PK类型,过滤器输入DTO,创建实体DTO和更新实体DTO

结果相同。

  1. 使用其他AsyncCrudAppService实现
    • AsyncCrudAppService<Commitment, CommitmentDto, Guid>其中定义了实体,其DTO和PK类型
    • AsyncCrudAppService<Commitment, CommitmentDto, Guid, CommitmentFilterInput> 其中定义了实体,其默认DTO,PK类型和过滤器输入DTO
    • AsyncCrudAppService<Commitment, CommitmentDto, Guid, CommitmentFilterInput, CreateCommitmentDto> 其中定义了实体,其默认DTO,PK类型,过滤器输入DTO和创建实体DTO
    • AsyncCrudAppService<Commitment, CommitmentDto, Guid, CommitmentFilterInput, CreateCommitmentDto, UpdateCommitmentDto> 其中定义了实体,其默认DTO,PK类型,过滤器输入DTO,创建实体DTO和更新实体DTO

结果相同。

  1. 使用编辑器进行验证

Swagger(OpenApi,我知道......)在https://editor.swagger.io/上提供了一个在线编辑器。

我复制了swagger.json并将其粘贴在编辑器中。我有一些关于Semantic的错误(我认为这是由Json转换为Yaml引起的)。

paths./api/services/app/Foo/GetAll.get.responses.200.schema.$ref $ ref值的语义错误必须符合RFC3986的百分比编码URI跳转到第234行 paths./api/services/app/Foo/GetAll.get.security.0.0中的语义错误安全范围定义无法解析Funds.BankAccounts跳转到第240行

我对CommitmentAppService没有特殊错误。我可以扩展除承诺方法之外的所有项目...浏览器崩溃,等等等等等等

  1. 承诺重命名为Toto
  2. 删除一些方法以验证Swagger的API数量不是太大
  3. 在Azure API管理中导入swagger.json我可以扩展所有方法,甚至是Commitment方法...但我不知道如何使用我的数据库(并且不是我的目标,我希望在本地调试)。
  4. 干净的构造函数 ......也许我注入的一个项目是错误的?
public CommitmentAppService(IRepository<Commitment, Guid> repository) 
: base(repository)
{ /**/ }

不...

如果有人有解决方案......

提问于
用户回答回答于

都是我的错!

我需要添加Commitment及其Dtos代码来了解我犯错的地方......

[Table("Commitment")]
public class Commitment : FullAuditedEntity<Guid>, 
{
    public string Property1 { get; set; }
    public Foo Foo { get; set; }
    public Guid FooId { get; set; }
}

[AutoMapFrom(typeof(Commitment))]
[AutoMapTo(typeof(Commitment), MemberList = AutoMapper.MemberList.Source)]
public class CommitmentDto : EntityDto<Guid>
{
    public string Property1 { get; set; }
    public Foo Foo { get; set; }
    public Guid FooId { get; set; }
}

我在CommitmentDto中使用实体对象而不是Dtos ......的确,我需要使用FooDto(而不是Foo)in CommitmentDto

所属标签

可能回答问题的人

  • 人生的旅途

    10 粉丝484 提问6 回答
  • 不吃貓的鱼oo

    5 粉丝466 提问6 回答
  • 富有想象力的人

    4 粉丝0 提问5 回答
  • Richel

    8 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励