Asp.net

在具有相同名稱的不同名稱空間中招搖不同的類不起作用

  • August 6, 2020

我有(超過)兩個 Api POST 端點。每個都需要一個json作為參數。但是當我在兩個端點參數類中使用相同的類名 Payload時, Swagger 不起作用。當我將其中一個從Payload更改為Payload1時,它就可以工作了。當然,我在包裝類中設置了正確的命名空間,以便它找到 Payload。但我希望每次都使用相同的名稱“Payload”。如何使用相同的類名Payload 我可以在這兩種情況下保留 json 名稱“Payload”,並為屬性設置不同的名稱(“Payload1”、“Payload2”)。有用。但是也有相同的屬性名稱會很好。,

在此處輸入圖像描述

端點 A

$$ HttpPost() $$ 公共非同步任務 PostPerson(

$$ FromBody $$JsonWrapperA jsonWrapperA)

namespace myProject.A
{
   public class JsonWrapperA
   {
       [JsonProperty("name", Required = Required.AllowNull)]
       public string Name { get; set; }

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

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

端點 B

$$ HttpPost() $$ 公共非同步任務 PostCompagn(

$$ FromBody $$JsonWrapperB jsonWrapperB)

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

預設情況下,swagger 將嘗試為作為 API 端點的返回類型或參數類型的對象建構其模式 ID,並將在文件的“模型”部分顯示這些對象。它將基於對象的類名建構這些模式 ID。

當您嘗試將兩個或多個類命名為相同時,即使它們位於不同的命名空間中,您也會收到衝突的 schemaIds 錯誤:

InvalidOperationException:衝突的 schemaIds:為 NamespaceOne.MyClass 和 NamespaceTwo.MyClass 類型檢測到相同的 schemaIds。有關解決方法,請參閱配置設置 - “CustomSchemaIds”

這意味著需要配置 Swagger 以更改其生成其 SchemaId 的方式。您可以簡單地告訴 swagger 使用對象完全限定名稱,該名稱將在 schemaIds 中包含命名空間。您可以通過以下方法在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);
   }
}

引用自:https://stackoverflow.com/questions/56475384