【问题标题】:Integrate swashbuckle swagger with odata in ASP.Net Core [closed]在 ASP.Net Core 中将 swashbuckle swagger 与 odata 集成 [关闭]
【发布时间】:2018-06-20 05:08:43
【问题描述】:

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

我无法整合为 odata 提供的路线。

我有以下配置,但收到一般错误。

这是错误

【问题讨论】:

  • 请将错误内嵌在消息中,以便于阅读。至于问题:您可以尝试使用.MapWhen 注册一个条件中间件。抱歉,现在无法写出复杂的答案,必须运行
  • 试试 NSwag。至少它不会因odata而窒息。 github.com/RSuter/NSwag

标签: asp.net-core odata swashbuckle


【解决方案1】:

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

据我所知,Swashbuckle for AspNetCore 不支持 OData。因此,在上面的链接中添加解决方法代码后,我们的 Swagger UI 可以正常工作,但没有显示任何 OData 端点。

链接中的代码 sn-p:

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

【讨论】:

    【解决方案2】:

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

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

    Github Example

    【讨论】:

    • 有 ASP.NET 5 的例子吗?
    【解决方案3】:

    您可以通过几种不同的方式集成 Swagger。对于准系统支持,您可以使用 OData 提供的ODataSwaggerConverter。这将有效地将 EDM 转换为 Swagger 文档。要将其连接到像 Swashbuckle 这样的 Swagger 生成器库,您只需创建并注册一个自定义生成器。事物的 UI 和客户端应该保持不变。如果生成的 Swagger 文档不够充分,ODataSwaggerConverter 的基本实现仍然是一个合理的开始。

    如果您将 API Versioning 用于 ASP.NET Core 的 OData,您只需添加相应的 API Explorer package。 Swashuckle 将在您几乎没有额外工作的情况下点亮。 ASP.NET Core with OData Swagger 示例应用程序有一个端到端的工作示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 2021-04-03
      • 2018-10-16
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      相关资源
      最近更新 更多