在我的 Net Core Web 项目中,我有一个“Startup.cs”文件,其中包含以下脚本:
namespace HangfireProject
{
public class Startup
{
public class MyAuthorizationFilter : IDashboardAuthorizationFilter
{
public bool Authorize(DashboardContext context) => true;
}
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(Configuration);
services.AddHangfire
(x => x.UseSqlServerStorage
(
Configuration.GetConnectionString("HangfireConnection")
)
);
services.AddHangfireServer();
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "HangfireProject", Version = Environment.GetEnvironmentVariable("BUILD_VERSION") ?? "v1" });
});
services.AddControllers();
services.AddRazorPages();
services.AddHealthChecks()
.AddCheck("Version", () => HealthCheckResult.Healthy(Environment.GetEnvironmentVariable("BUILD_VERSION") ?? "v1"))
.AddSqlServer(
Configuration.GetConnectionString("HangfireConnection"),
healthQuery: "SELECT 1;",
name: "HangfireConnection",
failureStatus: HealthStatus.Degraded,
tags: new string[] { "SqlServer", "HangfireConnection" }
);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
var pathBase = Configuration["API_PATH_BASE"] ?? "";
if(!string.IsNullOrWhiteSpace(pathBase))
{
app.UsePathBase($"/{pathBase.TrimStart('/')}");
}
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint($"{pathBase}/swagger/v1/swagger.json", $"HangfireProject {Environment.GetEnvironmentVariable("BUILD_VERSION") ?? "v1"}");
c.RoutePrefix = "hangfire/swagger";
});
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHangfireDashboard($"{pathBase}/hangfiredashboard", new DashboardOptions()
{
Authorization = new[] { new MyAuthorizationFilter() },
IgnoreAntiforgeryToken = true
});
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
app.UseHealthChecks($"{pathBase}/infra/selfcheck", new HealthCheckOptions
{
Predicate = _ => true,
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse,
ResultStatusCodes =
{
[HealthStatus.Healthy] = StatusCodes.Status200OK,
[HealthStatus.Degraded] = StatusCodes.Status200OK,
[HealthStatus.Unhealthy] = StatusCodes.Status500InternalServerError,
},
AllowCachingResponses = true,
});
}
}
}
当我在本地执行此 Web 项目时,我可以使用此 URL 正常访问 Swagger UI “https://localhost:32774/hangfire/swagger”
但是当我在服务器上执行此 Web 项目时,我无法使用此 URL 访问 Swagger UI “https://myproject.com/hangfire/swagger” 出现404错误时
--------------------
有人可以帮我分析一下这个问题的原因以及如何解决吗?
提前谢谢您。
路径库配置: 确保 PathBase 配置设置正确。特别是在服务器上运行时,正确定义 PathBase 至关重要。如果它在服务器上的子目录中运行,这一点尤其重要。在本地运行时,这可能不会导致问题,但在服务器上可能会出现问题。
var pathBase = 配置[“API_PATH_BASE”] ?? “”; 检查 SwaggerUI 路径: 如果在服务器上运行时访问 SwaggerUI 出现问题,请检查 SwaggerUI 是否使用特定路径。特别注意以下代码块:
c.SwaggerEndpoint($"{pathBase}/swagger/v1/swagger.json", $"HangfireProject {Environment.GetEnvironmentVariable("BUILD_VERSION") ?? "v1"}"); 这可确保 SwaggerUI 使用正确的路径来查找 JSON 文档。
服务器设置: 检查您的服务器配置和正在使用的 Web 服务器的设置(IIS、Apache、Nginx 等)。确保服务器正确路由子目录并执行必要的重定向。
检查日志记录: 检查在服务器上运行时生成的日志记录。日志中的错误消息或警告可以提供对问题的深入了解。日志可能包含来自 Hangfire 或其他组件的错误消息。
Hangfire 和 Swagger 版本: 检查您正在使用的 Hangfire 和 Swagger 版本。您的开发环境和服务器环境可能不一致。如果需要,请将软件包更新到与服务器上运行的软件包兼容的版本。
通过执行以下步骤,您可以识别并可能解决问题。如果问题仍然存在,请考虑联系您的服务器管理员,以获取有关特定服务器功能和配置的更多信息。