2017-02-01 4 views
1

J'ai un point de terminaison ASP.Net Web API 2 qui prend en charge les requêtes OData. Il est en tant que tel:Existe-t-il un moyen pour que Swashbuckle ajoute des paramètres OData au point de terminaison Web API 2 IQueryable <T>?

[HttpGet, Route("")] 
public IQueryable<Thing> Get() 
{ 
    return _thingsRepository.Query(); 
} 

Le paramètre OData $ filter fonctionne parfaitement. Je souhaite juste qu'ils apparaissent dans Swagger comme ils le font pour les contrôleurs OData réels. J'utilise Swashbuckle.OData ... mais je ne suis vraiment pas sûr qu'il m'achète quoi que ce soit dans ce cas.

Répondre

3

Il s'avère qu'il est assez facile d'ajouter les paramètres que vous voulez Swagger utilisant SwashBuckle en utilisant un IOperationFilter. Vous pouvez l'ajouter dans votre configuration Swagger en utilisant c.OperationFilter<ODataParametersSwaggerDefinition>();. J'ai créé celui qui ajoute des paramètres OData à tous les points de terminaison IQueryable dans mon API:

/// <summary> 
///  Add the supported odata parameters for IQueryable endpoints. 
/// </summary> 
public class ODataParametersSwaggerDefinition : IOperationFilter 
{ 
    private static readonly Type QueryableType = typeof(IQueryable); 

    /// <summary> 
    ///  Apply the filter to the operation. 
    /// </summary> 
    /// <param name="operation">The API operation to check.</param> 
    /// <param name="schemaRegistry">The swagger schema registry.</param> 
    /// <param name="apiDescription">The description of the api method.</param> 
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) 
    { 
     var responseType = apiDescription.ResponseType(); 

     if (responseType.GetInterfaces().Any(i => i == QueryableType)) 
     { 
      operation.parameters.Add(new Parameter 
      { 
       name = "$filter", 
       description = "Filter the results using OData syntax.", 
       required = false, 
       type = "string", 
       @in = "query" 
      }); 

      operation.parameters.Add(new Parameter 
      { 
       name = "$orderby", 
       description = "Order the results using OData syntax.", 
       required = false, 
       type = "string", 
       @in = "query" 
      }); 

      operation.parameters.Add(new Parameter 
      { 
       name = "$skip", 
       description = "The number of results to skip.", 
       required = false, 
       type = "integer", 
       @in = "query" 
      }); 

      operation.parameters.Add(new Parameter 
      { 
       name = "$top", 
       description = "The number of results to return.", 
       required = false, 
       type = "integer", 
       @in = "query" 
      }); 

      operation.parameters.Add(new Parameter 
      { 
       name = "$count", 
       description = "Return the total count.", 
       required = false, 
       type = "boolean", 
       @in = "query" 
      }); 
     } 
    } 
}