2016-12-06 6 views
3

Ich benutze Swashbuckle, um swagger Dokumentation \ UI für ein Webapi2-Projekt zu generieren. Unsere Modelle werden mit einigen Legacy-Interfaces geteilt, daher gibt es einige Eigenschaften, die ich bei den Modellen ignorieren möchte. Ich kann das JsonIgnore-Attribut nicht verwenden, da die Legacy-Schnittstellen auch zu JSON serialisiert werden müssen, damit ich die Eigenschaften nicht global in der Swashbuckle-Konfiguration ignorieren möchte.So konfigurieren Sie Swashbuckle, um Eigenschaft auf Modell zu ignorieren

fand ich eine Methode, dies hier dokumentiert tun:

https://github.com/domaindrivendev/Swashbuckle/issues/73

Aber dies scheint mit dem aktuellen Swashbuckle Release veraltet zu sein.

Das Verfahren für die alte Version von Swashbuckle empfohlen wird unter Verwendung einer IModelFilter Implementierung wie folgt:

public class OmitIgnoredProperties : IModelFilter 
{ 
    public void Apply(DataType model, DataTypeRegistry dataTypeRegistry, Type type) 
    { 
     var ignoredProperties = // use reflection to find any properties on type decorated with the ignore attributes 
     foreach (var prop in ignoredProperties) 
     { 
      model.Properties.Remove(prop.Name); 
     } 
    } 
} 

SwaggerSpecConfig.Customize(c => c.ModelFilter<OmitIgnoredProperties>()); 

Aber ich bin nicht sicher, wie Swashbuckle zu konfigurieren, dass die IModelFilter in der aktuellen Version zu benutzen? Ich benutze Swashbuckle 5.5.3.

+0

können Sie verwende eigentlich JsonIgno Re Property, die nicht die Eigenschaft in der Swagger –

+0

Wie in der Frage erwähnt, ich möchte nicht JsonIgnore verwenden, wie ich Legacy-Code, der auch die Modelle verwenden muss, und wenn ich JsonIgnore, die Auswirkungen beeinflussen wird beeinflussen und die Legacy-Code ... – mutex

Antwort

4

Nun, mit ein wenig Stocher fand ich einen Weg, um diese mit ISchemaFilter zu tun:

public class ApplyCustomSchemaFilters : ISchemaFilter 
{ 
    public void Apply(Schema schema, SchemaRegistry schemaRegistry, Type type) 
    { 
     var excludeProperties = new[] {"myProp1", "myProp2", "myProp3"}; 

     foreach(var prop in excludeProperties) 
      if (schema.properties.ContainsKey(prop)) 
       schema.properties.Remove(prop); 
    } 
} 

dann, wenn httpConfiguration.EnableSwagger Aufruf ich die SwaggerDocsConfig setzen Sie diesen SchemaFilter wie folgt zu verwenden:

c.SchemaFilter<ApplyCustomSchemaFilters>(); 

Hoffe, das hilft jemandem. Ich wäre trotzdem neugierig, ob es irgendwie möglich ist, IModelFilter zu verwenden.

2

(Based on mutex's answer.)

habe ich eine andere Linie mit NullReferenceException nicht Probleme haben.

public void Apply(Schema schema, SchemaRegistry schemaRegistry, Type type) 
{ 
    var excludeProperties = new[] { "myProp1", "myProp2, myProp3"}; 

    foreach (var prop in excludeProperties) 
     if(schema.properties != null) // This line 
     if (schema.properties.ContainsKey(prop)) 
     schema.properties.Remove(prop);   
}

Wenn Sie alle Schemata

public void Apply(Schema schema, SchemaRegistry schemaRegistry, Type type) 
{ 
    schema.properties = null;  
} 
3

Hier löschen wollen, ist, was ich mit Newtonsoft.Json.JsonIgnoreAttribute verwendet:

internal class ApplySchemaVendorExtensions : Swashbuckle.Swagger.ISchemaFilter 
{ 
    public void Apply(Schema schema, SchemaRegistry schemaRegistry, Type type) 
    { 
     foreach (var prop in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance) 
           .Where(p => p.GetCustomAttributes(typeof(Newtonsoft.Json.JsonIgnoreAttribute), true)?.Any() == true)) 
      if (schema?.properties?.ContainsKey(prop.Name) == true) 
       schema?.properties?.Remove(prop.Name); 
    } 
} 
6

Wenn Sie markieren Feld/Eigenschaft als interne oder geschützt oder privat, es wird automatisch von swashbuckle in der Swagger-Dokumentation ignoriert.

+0

Dies ist die schönste Lösung IMO – infl3x

1

Wenn Sie dies tun müssen, aber ohne JsonIgnore zu verwenden (möglicherweise müssen Sie die Eigenschaft noch serialisieren/deserialisieren), erstellen Sie einfach ein benutzerdefiniertes Attribut.

[AttributeUsage(AttributeTargets.Property)] 
public class SwaggerExcludeAttribute : Attribute 
{ 
} 

Dann wird ein Schema Filter ähnlich wie Johng's

public class SwaggerExcludeFilter : ISchemaFilter 
{ 
    #region ISchemaFilter Members 

    public void Apply(Schema schema, SchemaRegistry schemaRegistry, Type type) 
    { 
     if (schema?.properties == null || type == null) 
      return; 

     var excludedProperties = type.GetProperties().Where(t => t.GetCustomAttribute<SwaggerExcludeAttribute>() != null); 
     foreach (var excludedProperty in excludedProperties) 
     { 
      if (schema.properties.ContainsKey(excludedProperty.Name)) 
       schema.properties.Remove(excludedProperty.Name); 
     } 
    } 

    #endregion 
} 

Vergessen Sie nicht, den Filter

c.SchemaFilter<SwaggerExcludeFilter>(); 
+0

Es scheint, dass dies nur für Ausgabemodelle funktioniert? Wenn ich diesen Code auf ein Eingabemodell (von GET verwendet) anwenden, wird dieses Modell nicht gefunden? –

0

Die AspNetCore Lösung sieht aus wie zu registrieren:

public class SwaggerExcludeSchemaFilter : ISchemaFilter 
{ 
    public void Apply(Schema schema, SchemaFilterContext context) 
    { 
     if (schema?.Properties == null) 
     { 
      return; 
     } 

     var excludedProperties = context.SystemType.GetProperties().Where(t => t.GetCustomAttribute<SwaggerExcludeAttribute>() != null); 
     foreach (PropertyInfo excludedProperty in excludedProperties) 
     { 
      if (schema.Properties.ContainsKey(excludedProperty.Name)) 
      { 
       schema.Properties.Remove(excludedProperty.Name); 
      } 
     } 
    } 
} 
Verwandte Themen