在具有相同名称的不同名称空间中摇摇欲坠的不同类不起作用

时间:2019-06-06 10:09:36

标签: asp.net asp.net-web-api asp.net-core

我有(超过)两个Api POST端点。每个人都需要一个json作为参数。但是,当我在两个端点参数类中使用相同的类名 有效负载时, Swagger不起作用。当我更改其中之一时从 Payload Payload1 。 当然,我在包装器类中设置了正确的名称空间,以便它找到有效载荷。但我希望每次都使用相同的名称“有效负载”。 如何使用相同的类名有效载荷 在这两种情况下,我都可以保留json名称“ Payload”,并为属性设置不同的名称(“ Payload1”,“ Payload2”)。有用。但是也可以使用相同的属性名称。

enter image description here

端点A

[HttpPost()]

公共异步任务PostPerson([FromBody] JsonWrapperA jsonWrapperA)

namespace myProject.B
{
    public class JsonWrapperB
    {
        [JsonProperty("compagny", Required = Required.AllowNull)]
        public string Compagny { get; set; }

        [JsonProperty("payload", Required = Required.AllowNull)]
        public Payload Payload { get; set; }
    }

    public class Payload
    {
        [JsonProperty("age", Required = Required.AllowNull)]
        public double Age{ get; set; }
    }
}

端点B

[HttpPost()]

公共异步任务PostCompagn([FromBody] JsonWrapperB jsonWrapperB)

elementRef.nativeElement.attributes.ng-reflect-router-link

2 个答案:

答案 0 :(得分:3)

默认情况下,swagger会尝试为API端点的返回类型或参数类型的对象构建其架构ID,并将在文档的“模型”部分中显示这些对象。它将基于对象的类名称构建这些架构ID。

当您尝试将两个或多个相同的类命名为相同名称时,即使它们位于不同的命名空间中,也会出现冲突的schemaIds错误:

  

InvalidOperationException:冲突的schemaIds:为NamespaceOne.MyClass和NamespaceTwo.MyClass类型检测到相同的schemaIds。请参阅配置设置-“ CustomSchemaIds”以获取解决方法

这意味着需要配置Swagger才能更改其生成SchemaId的方式。您可以简单地告诉swagger使用对象的完全限定名称,该名称将在schemaId中包含名称空间。您可以在Startup.cs方法的ConfigureServices文件中执行以下操作:

//add using statement for Swagger in Startup.cs
using Swashbuckle.AspNetCore.Swagger;

...

public void ConfigureServices(IServiceCollection services)
{
    services.AddSwaggerGen(config =>
    {
        //some swagger configuration code.

        //use fully qualified object names
        config.CustomSchemaIds(x => x.FullName);
    }
}

答案 1 :(得分:0)

使用Swashbuckle.AspNetCore版本5.5.1,我遇到了同样的问题,因此我使用JustSomeDude答案解决了它,但是之后所有实体都显示了全名,因此我需要一种仅显示名称的方法。这就是我所做的:

    options.CustomSchemaIds(x => x.FullName); // Enables to support different classes with the same name using the full name with namespace
    options.SchemaFilter<NamespaceSchemaFilter>(); // Makes the namespaces hidden for the schemas

使用此过滤器类:

     public class NamespaceSchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (schema is null)
        {
            throw new System.ArgumentNullException(nameof(schema));
        }

        if (context is null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        schema.Title = context.Type.Name; // To replace the full name with namespace with the class name only
    }
}