C# 如何修复.net core 2.2应用程序中找不到的swagger.json
我正在IIS服务器上部署我的.net core应用程序,并在未找到swagger.json的swagger UI中面临问题。当我在本地(开发环境)运行它时,一切都正常工作,但当我在IIS服务器上部署它时,它找不到swagger.json文件 以前我在.NETCore2.1应用程序中遇到过这个问题,我通过编写下面的代码来获取虚拟基路径,从而解决了这个问题C# 如何修复.net core 2.2应用程序中找不到的swagger.json,c#,asp.net-core,asp.net-core-2.2,C#,Asp.net Core,Asp.net Core 2.2,我正在IIS服务器上部署我的.net core应用程序,并在未找到swagger.json的swagger UI中面临问题。当我在本地(开发环境)运行它时,一切都正常工作,但当我在IIS服务器上部署它时,它找不到swagger.json文件 以前我在.NETCore2.1应用程序中遇到过这个问题,我通过编写下面的代码来获取虚拟基路径,从而解决了这个问题 string basePath = Environment.GetEnvironmentVariable("ASPNETCORE_APPL_PA
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 = "";
});
}
但abouve代码不起作用,因为它返回的是实际的物理路径而不是虚拟路径
- 上述代码的输出:C:/inetpub/wwwroot/myapp/swagger/v1/swagger.json
- 预期产出:
有人知道如何在.NETCore2.2中获取虚拟路径作为
Environment.GetEnvironmentVariable(“ASPNETCORE_APPL_path”)代码>不工作。任何潜在客户都会有帮助。我已经通过在.net核心应用程序中添加以下代码解决了我的问题
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("./swagger/v1/swagger.json", "Test.Web.Api");
c.RoutePrefix = string.Empty;
});
}
根据文档,如果您在IIS中托管./
我希望这个答案能节省你的时间 您可以通过以下方式修复此问题:
包:#区域组件swashback.AspNetCore.Swagger,版本=4.0.1.0
框架:.Net核心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");
);
}
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddSwaggerDocument();
当您在本地运行应用程序或在IIS上托管应用程序时,这是可行的 我尝试使用c.swagger端点(“./swagger/v1/swagger.json”,“Test.Web.Api”)代码>,但问题是它确实有帮助
我已经从VS开始使用IIS Express
我犯了个错误
未能加载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;
});
解决方案已在中找到,请在下面查找:
app.UseSwaggerUI(c =>
{
string swaggerJsonBasePath = string.IsNullOrWhiteSpace(c.RoutePrefix) ? "." : "..";
c.SwaggerEndpoint($"{swaggerJsonBasePath}/swagger/v1/swagger.json", "My API");
});
我没有在文档中看到它,但它在
- 由IIS Express在本地托管,在
iisExpress\applicationUrl中的主机名后有(或没有)附加路径
- 在暂存环境中由IIS托管(主机名后面有附加路径,如
http://staginghost/char/swagger
适用于.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");
);
}
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddSwaggerDocument();
然后
对于.NETCore5,在创建项目时会自动添加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"));
}
在我的例子中,我忘记将HTTPGet属性添加到我的controller public get方法中,我遇到了这个问题,发现您必须匹配路径中版本的确切类型以及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"); });
根据Swashback文档,您应该能够只使用“/swagger/v1/swagger.json”并且没有预先添加托管URL。这不起作用吗?编辑为在路径前面添加句点,因为我注意到它没有在域的根目录下运行。是的,我也尝试过,但没有起作用。无法获取swagger.json文件。我有类似的问题,但原因可能不同。如果有人想查看我的体验,可以,但我错过了“/”之前“/”。谢谢!不幸的是,这不起作用。我使用IIS express托管应用程序,并将launchsettings.json
设置为“iisExpress”:{“applicationUrl”:”http://localhost/char“,
测试IIS虚拟目录。但是问题是,localhost/char/swagger
显示404错误,但localhost/char/swagger/v1/swagger.json
工作正常(显示json文件).localhost/swagger
如果applicationUrl
值中没有路径,则可以正常工作。我使用的是netcore31
和swashback.AspNetCore 5.0.0
package@VAAA是的,我有。请检查此线程,而此代码可能会回答问题,提供有关此代码为什么和/或如何回答的其他上下文这个问题提高了它的长期价值。@GabrielSimas这个解决方案已经有两年历史了。试着发布新的Swashback.WebApi,如果你认为它做得很好,就发布它。