在 ASP.Net Core 中将 Swashbuckle Swagger 与 OData 集成

13

我尝试在asp.net core中同时实现swagger和odata,但是它们无法正常工作。

我无法集成给定的odata路由。

以下是我的配置,并且我收到了一个通用错误。

Configuration

这是错误:

this is the error


1
请将错误信息放在消息中,以便更容易阅读。至于问题:您可以尝试使用.MapWhen来注册条件中间件。抱歉,现在无法编写复杂的答案,必须走了。 - Tseng
试试 NSwag。至少它不会在 OData 上出现问题。 https://github.com/RSuter/NSwag/ - Will Tartak
3个回答

20

当我们向我们的.Net Core项目添加OData时,我们遇到了相同的问题。此帖子中代码片段中显示的解决方法可以在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();
        });
    }
}

6

我可以使用DocumentFilter来完成这个操作。创建一个类,像下面的例子一样,然后将其添加到Swagger配置中:

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

Github示例


有没有 ASP.NET 5 的示例? - botenvouwer

4
你可以通过几种不同的方式集成Swagger。对于基本支持,您可以使用OData提供的ODataSwaggerConverter。这将有效地将EDM转换为Swagger文档。要将其连接到像Swashbuckle这样的Swagger生成器库,您只需要创建并注册一个自定义生成器。UI和客户端方面的事情应该保持不变。如果生成的Swagger文档不足够,ODataSwaggerConverter的基本实现仍然是一个合理的起点。
如果您正在使用ASP.NET Core的OData进行API版本控制,则只需添加相应的API Explorer package即可。Swashuckle将在您的工作中几乎不需要额外的工作。ASP.NET Core with OData Swagger示例应用程序具有端到端的工作示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接