Swagger падает, когда я добавляю новую службу приложений - PullRequest
0 голосов
/ 09 октября 2018

Прежде чем вы прочитаете этот пост , знайте, что я уже посмотрел этот пост и ... Проблема почти такая же, и я попробовал решение.Так что этот пост не дублируется.

Мы использовали шаблон запуска 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.Конфигурация вроде бы в порядке (мы добавили немного пост-JavaScript для ABP, ...) и т. Д.

Изначально у меня были следующие версии:

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

У нас было 385 API.

Я добавил новый AppService, Commitment, с его менеджером, Dtos и т. Д.

В тот момент, когда я запускаюсь и захожу вswagger, мой браузер вылетает и отображает сообщение, спрашивающее, хочу ли я остановить скрипт (IE, Edge, Firefox, Chrome, ...).

В режиме отладки у меня нет информации относительно возможного исключенияthrowed.

Пробовал:

  1. Обновление Swashbuckle.AspNetCore Пакет NuGet (все версии: 1.2, 2.X и 3.0.0)

    • В версии 1.X у меня та же проблема.
    • В версии 2.5 пользовательский интерфейс не отображается.
    • В других версиях пользовательский интерфейс отображается,Я могу использовать все методы, КРОМЕ моих новых методов, Commitment.Когда я щелкаю его мышью, у меня появляется только вертушка ... Браузер зависает и спрашивает меня, хочу ли я остановить сценарий или подождать.Swagger UI freezes

В Chrome Chrome вызывает ошибку: Chrome debugging catches an exception

Удалить переопределенные методы для обязательств.

В случае, если мой код неверен внутри переопределенных методов.

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

Тот же результат.

Используйте только один DTO (CommitmentDto) вместо набора DTO 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

Тот же результат.

Использование других реализаций 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

Тот же результат.

Используйте редактор для проверки

Swagger (OpenApi, я знаю ...) предоставляет онлайн-редактор на https://editor.swagger.io/

Я скопировалswagger.json и вставил его в редактор.У меня есть некоторые ошибки по поводу Semantic (я думаю, что это вызвано преобразованием Json в Yaml).

Семантическая ошибка на пути.234

Семантическая ошибка в paths./api/services/app/Foo/GetAll.get.security.0.0 Определение области безопасности Funds.BankAccounts не может быть решена Перейти к строке 240

У меня нет особой ошибки для CommitmentAppService.Я могу развернуть все элементы, кроме методов Обязательства ... Браузер падает, бла-бла-бла

Переименовать Обязательство Toto

Удалить несколько методов , чтобы убедиться, что число API-интерфейсов не слишком велико дляSwagger

Импорт swagger.json в Azure API Management Я могу развернуть все методы, даже методы фиксации ... Но я не знаю, как их использовать моя база данных (и не моя цель, я хочу отладить локально).

Чистый конструктор ... Может быть, один из моих инъекцийЧто-то не так?

public CommitmentAppService(IRepository<Commitment, Guid> repository) 
: base(repository)
{ /**/ }

Нет ...


Если у кого-то есть решение ...

1 Ответ

0 голосов
/ 11 октября 2018

Это моя вина!

Мне нужно добавить 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) в CommitmentDto.

...