IEdmModel.ConvertToOpenApi() throws System.InvalidOperationException when having dollar-count similar path in controller

Aberta Para iniciantes
#661 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
68/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Estagnada
Stack de tecnologia
csharp
Domínio
api

Direção de pesquisa

Comece em src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs, próximo de AppendBoundOperationOnNavigationSourcePath() na linha 950, e reproduza a falha com a operação Count() descrita na issue. Rastreie como AppendPath modifica IList e, em seguida, verifique se ConvertToOpenApi cria o documento sem a exceção de modificação da coleção, conferindo também o efeito nos caminhos de $count e Count().

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

I have a Count() operation in an ODataController. When I call ConvertToOpenApi on the IEdmModel a System.InvalidOperationException: 'Collection was modified; enumeration operation may not execute.' is thrown ( in src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs).

Assemblies affected

occurs at least in:

  • Microsoft.OpenApi.OData 1.7.4
  • Microsoft.OpenApi.OData 2.0.0 preview 8
Steps to reproduce

In an ODataController, add a dollar-count-similar operation, eg:

[HttpGet]
[Description("Shows the total count of entities")]
public async Task<IActionResult> Count()
{
    return await CountEntities();
}

Add the function to the ODataConventionModelBuilder, eg:
builder.EntityType<Entity>().Collection.Function(nameof(EntitiesController.Count)).Returns<int>();

Create the IEdmModel and call

var edmModel = odataBuilder.GetEdmModel();
var document = edmModel.ConvertToOpenApi();
Expected result

The OpenApiDocument gets created.

Actual result

System.InvalidOperationException: 'Collection was modified; enumeration operation may not execute.'
Following the StackTrace the reason is:
AppendBoundOperationOnNavigationSourcePath() has a foreach on IList, which calls AppendPath(newPath);, which results in a modification of the paths, if a dollar-count-similar path is found, hence resulting in the InvalidOperationException.

Additional detail

Creating a copy of the collection before iterating over it in ODataPathProvider.cs L950 would work in my use-case, but keeps the $count and Count() operations in the openapi specification. Don't know if that is a problem.

foreach (var subPath in value.ToList())
...

As a workaround - not using dollar-similar-paths in your OData operations removes the issue as well ;)

Linguagem predominante
C#
Estrelas
240
Forks
70
Merge médio
7h 59min
PRs com merge (30d)
13

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de microsoft/OpenAPI.NET.OData

Todas as issues de microsoft/OpenAPI.NET.OData

Issues semelhantes

Mais issues de C#

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.