将swashbuckle swagger与odata集成在ASP.Net Core中

时间:2018-06-20 05:08:43

标签: asp.net-core odata swashbuckle

我试图在asp.net核心中同时实现(swagger和odata),但是它不起作用。

我无法集成为odata提供的路由。

我具有以下配置,并且收到一般错误。

Configuration

这是错误

this is the error

3 个答案:

答案 0 :(得分:6)

将OData添加到.Net Core项目时,我们遇到了同样的问题。 this post上的代码片段中显示的解决方法解决了Swagger UI加载时我们的API错误。

据我所知,Swashbuckle for AspNetCore不支持OData。因此,在上面的链接中添加了变通方法代码之后,我们的Swagger UI可以运行,但是没有OData端点显示。

链接中的代码段:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.AddOData();

        // Workaround: https://github.com/OData/WebApi/issues/1177
        services.AddMvcCore(options =>
        {
            foreach (var outputFormatter in options.OutputFormatters.OfType<ODataOutputFormatter>().Where(_ => _.SupportedMediaTypes.Count == 0))
            {
                outputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/prs.odatatestxx-odata"));
            }
            foreach (var inputFormatter in options.InputFormatters.OfType<ODataInputFormatter>().Where(_ => _.SupportedMediaTypes.Count == 0))
            {
                inputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/prs.odatatestxx-odata"));
            }
        });
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {                
        var builder = new ODataConventionModelBuilder(app.ApplicationServices);

        builder.EntitySet<Product>("Products");

        app.UseMvc(routebuilder => 
        {
            routebuilder.MapODataServiceRoute("ODataRoute", "odata", builder.GetEdmModel());

            // Workaround: https://github.com/OData/WebApi/issues/1175
            routes.EnableDependencyInjection();
        });
    }
}

答案 1 :(得分:4)

我能够使用DocumentFilter做到这一点。创建一个类似于以下示例的类,然后将其添加到您的Swagger配置中:

        services.AddSwaggerGen(options =>
        {
            options.SwaggerDoc("v1", new Info { Title = "Your title API v1.0", Version = "v1.0" });
            options.DocumentFilter<CustomDocumentFilter>();
        });

Github Example

答案 2 :(得分:1)

您可以通过两种不同的方式集成Swagger。要获得准系统支持,可以使用OData提供的ODataSwaggerConverter。这将有效地将EDM转换为Swagger文档。要将其连接到Swagger生成器库(如Swashbuckle),只需创建并注册一个自定义生成器。用户界面和客户端应保持不变。如果生成的Swagger文档不足,则 ODataSwaggerConverter 的基本实现仍然是一个合理的开始。

如果您将API Versioning用于带有ASP.NET Core的OData,则只需添加相应的API Explorer package。 Swashuckle将点亮,几乎不需要您进行任何其他工作。 ASP.NET Core with OData Swagger示例应用程序有一个端到端的工作示例。