我试图在asp.net核心中同时实现(swagger和odata),但是它不起作用。
我无法集成为odata提供的路由。
我具有以下配置,并且收到一般错误。
这是错误
答案 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>();
});
答案 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示例应用程序有一个端到端的工作示例。