问题描述
我们正在尝试在我们的 asp.net 核心 API 项目中使用 Nswag 和 Odata.我们可以使用 Nswag 获取 API 文档,也可以使用 Odata 来简化查询.但是当我们同时使用它们并尝试访问 API swagger 文档时(
We are trying to use Nswag and Odata both in our asp.net core API project. We can either Nswag for API documentation or Odata for query simplification. But when we use both of them and try to access API swagger document (https://localhost:5001/swagger/index.html) it's generating this error:
这是我的启动文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Microsoft.AspNet.OData.Extensions;
using System.Web.Http;
using Microsoft.OpenApi.Models;
using System.Reflection;
using Newtonsoft.Json;
using Microsoft.AspNet.OData.Builder;
using GL.Data.Models.EntityClass;
using Microsoft.Net.Http.Headers;
using Microsoft.AspNet.OData.Formatter;
using Newtonsoft.Json.Serialization;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal;
using Newtonsoft.Json.Converters;
namespace GL.service
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.AddJsonOptions(options =>
{
// Use camel case properties in the serializer and the spec (optional)
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
// Use string enums in the serializer and the spec (optional)
options.SerializerSettings.Converters.Add(new StringEnumConverter());
});
// registers a Swagger v2.0 document with the name "v1" (default)
services.AddSwaggerDocument(c => {
c.DocumentName = "V1";
c.Title = "GL Controller";
});
services.AddOData();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseCors(b => b.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().AllowCredentials());
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseOpenApi(); // Serves the registered OpenAPI/Swagger documents by default on
app.UseSwaggerUi3(); // Serves the Swagger UI 3 web ui to view the OpenAPI/Swagger
app.UseMvc(routeBuilder =>
{
routeBuilder.EnableDependencyInjection();
routeBuilder.Expand().Select().Filter().Count().OrderBy();
});
}
}
}
请帮忙解决这个问题.
推荐答案
这里有一个 workaround 可以修复 APINSwag UI 加载时出现错误.但是 Swashbuckle for AspNetCore 不支持 OData,并且任何 OData 端点都不会显示在您的 NSwag UI 中.
Here is a workaround that you could fix API error(s) when NSwag UI loads.But OData isn't supported in Swashbuckle for AspNetCore and none of the OData endpoints will show in your NSwag UI.
services.AddOData();
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"));
}
});
记得将 services.AddOData();
放在 services.AddMvcCore()
行之前.
Remember to place services.AddOData();
before the line services.AddMvcCore()
.
参考https://github.com/OData/WebApi/issues/1177一个>
这篇关于尝试访问 swagger 端点时,将 Nswag 与 Odata 一起使用会产生错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!