我将.net核心应用程序部署在IIS服务器上,并且在swagger UI中遇到了找不到swagger.json的问题。当我在本地运行(开发环境)时,一切运行正常,但是当我在IIS服务器上部署它时,找不到swagger.json文件。
以前,我在.net core 2.1应用程序中遇到过此问题,我通过编写以下代码来获取虚拟基本路径来解决此问题。
string basePath = Environment.GetEnvironmentVariable("ASPNETCORE_APPL_PATH");
basePath = basePath == null ? "/" : (basePath.EndsWith("/") ? basePath : $"{basePath}/");
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint($"{basePath}swagger/v1/swagger.json", "Test.Web.Api");
c.RoutePrefix = "";
});
我尝试了以下代码来解决它:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint($"{env.ContentRootPath}swagger/v1/swagger.json", "Test.Web.Api");
//OR
c.SwaggerEndpoint($"{env.WebRootPath}swagger/v1/swagger.json", "Test.Web.Api");
c.RoutePrefix = "";
});
}
但是上面的代码没有用,因为它返回实际的物理路径而不是虚拟路径。
由于Environment.GetEnvironmentVariable("ASPNETCORE_APPL_PATH");
无法正常工作,是否有人知道如何在.net core 2.2中获取虚拟路径。任何线索都会有所帮助。
答案 0 :(得分:3)
我通过在.net核心应用中放置以下代码来解决问题。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("./swagger/v1/swagger.json", "Test.Web.Api");
c.RoutePrefix = string.Empty;
});
}
根据swashbuckle文档,如果要在IIS中托管./,则需要在./之前加上前缀。
我希望这个答案可以节省您的时间!
答案 1 :(得分:3)
对于 .net core 5,在创建项目时会自动添加 swagger。
public void ConfigureServices(IServiceCollection services)
{
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProject.Api", Version = "v1" });
});
}
但是,您需要确保两条注释行在 if 块之外。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider svp)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
//app.UseSwagger();
//app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProject.Api v1"));
}
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProject.Api v1"));
}
答案 2 :(得分:2)
我遇到了这个问题,发现您必须匹配路径中版本的确切类型以及 servicescollection 和 appbuilder
services.AddSwaggerGen(c => {
c.SwaggerDoc("v1" , new OpenApiInfo{ Title = "MyApp API" , Version = "v1" });
});
app.UseSwagger(); app.UseSwaggerUI(c => {
c.SwaggerEndpoint("/swagger/v1/swagger.json","MyApp API v1"); });
答案 3 :(得分:0)
您可以通过以下方式解决此问题:
包装:#region组装Swashbuckle.AspNetCore.Swagger,版本= 4.0.1.0
框架:.Net Core 2.2
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
// Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
// specifying the Swagger JSON endpoint.
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Versioned Api v1");
);
}
当您在本地运行或在IIS上运行应用程序时,这是可行的。
答案 4 :(得分:0)
我尝试使用Mahesh's answer中的c.SwaggerEndpoint("./swagger/v1/swagger.json", "Test.Web.Api");
,但问题是它确实有帮助。
我已经开始使用IIS Express从Swashbuckle sample开始使用VS
我遇到错误
无法加载API定义。未定义./swagger/v1/swagger.json
何时从Web浏览器访问localhost/char/swagger
端点。
我修改了launchsettings.json\iisExpress\applicationUrl
并添加了"iisExpress": { "applicationUrl": "http://localhost/char"
之类的路径
和Startup.cs
源代码,例如
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("./swagger/v1/swagger.json", "Test.Web.Api");
c.RoutePrefix = string.Empty;
});
在Github issue找到了解决方案,请在下面找到它:
app.UseSwaggerUI(c =>
{
string swaggerJsonBasePath = string.IsNullOrWhiteSpace(c.RoutePrefix) ? "." : "..";
c.SwaggerEndpoint($"{swaggerJsonBasePath}/swagger/v1/swagger.json", "My API");
});
我在文档中没有看到它,但是它在以下时间起作用
iisExpress\applicationUrl
中,主机名后面带有(或不带有)附加路径,http://staginghost/char/swagger
答案 5 :(得分:0)
对于.Net Core 2.2
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddSwaggerDocument();
然后
// 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();
app.UseOpenApi();
app.UseSwaggerUi3();
}
else
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
答案 6 :(得分:0)
在我的情况下,我忘记添加 HTTPGet 属性之一我的控制器公共获取方法