Постановка задачи: Я сталкиваюсь с ошибкой 500 с сообщением «Не удалось загрузить определение API» при сборке и запуске проекта .NET 8. В пользовательском интерфейсе появляется ошибка, указывающая на проблему с загрузкой документации API.
Пример кода: Вот пример кода моего ReportsController:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
namespace DMSSWE.SECURITY.WEBAPI.Controllers
{
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class ReportsController : ControllerBase
{
private readonly IReports _bl;
private readonly string[] connectionValues = new string[2];
public ReportsController()
{
connectionValues[0] = GlobalData.ConnectionString;
connectionValues[1] = GlobalData.ConnectionType.ToString();
switch (Convert.ToInt32(connectionValues[1]))
{
case (int)ConnectionType.MSSQL:
_bl = new ReportsSQL();
break;
case (int)ConnectionType.ORACLE:
_bl = new ReportsORA();
break;
case (int)ConnectionType.POSTGRESQL:
_bl = new ReportsPGSQL();
break;
default:
break;
}
}
[HttpPost]
[Route("PostReportDetails")]
public IActionResult PostReportDetails([FromBody] IREPORTSDTO reports)
{
try
{
bool result = _bl.PostReportDetails(connectionValues, reports);
return this.Ok(result);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
}
Подробности Платформа: .NET 8. Проблема: Пользовательский интерфейс отображает ошибку 500 с сообщением «Не удалось загрузить определение API» после запуска проекта. Цель: понять причину ошибки и найти способ ее устранения. Что я пробовал
Будем очень признательны за любые идеи или предложения о том, как решить эту проблему. Заранее спасибо за вашу помощь!
Кажется, код в вашем контроллере отчетов не полностью? Мог бы поделиться всеми методами в этом контроллере.





@Meligy, вот мой файл Startup.cs
using DMSSWE.SECURITY.WebAPI.Bussiness.HealthCheck;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.AspNetCore.Identity;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using System;
using static System.Net.Mime.MediaTypeNames;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.OpenApi.Models;
using DMSSWE.SECURITY.WEBAPI.Common;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(
policyBuilder =>
{
policyBuilder.WithOrigins(builder.Configuration.GetValue<string>("AllowedOrigins")?.Split(",") ?? new string[0]);
policyBuilder.AllowAnyHeader();
policyBuilder.AllowAnyMethod();
policyBuilder.AllowCredentials();
});
});
// Set the global variables
JwtConfig.SecretKey = builder.Configuration["JWT:Secret"];
JwtConfig.Issuer = builder.Configuration["JWT:Issue"];
JwtConfig.Audience = builder.Configuration["JWT:Audience"];
JwtConfig.TokenValidityInMinutes = TimeSpan.FromMinutes(Convert.ToInt32(builder.Configuration["JWT:TokenValidityInMinutes"]));
JwtConfig.RefreshTokenValidityInMinutes = Convert.ToInt32(builder.Configuration["JWT:RefreshTokenValidityInMinutes"]);
// Add services to the container.
var tokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidIssuer = JwtConfig.Issuer,
ValidateAudience = true,
ValidAudience = JwtConfig.Audience,
ValidateIssuerSigningKey = true,
IssuerSigningKey = JwtConfig.GetSymmetricSecurityKey(),
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
builder.Services.AddSingleton(tokenValidationParameters);
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = tokenValidationParameters;
});
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new() { Title = "Security API", Version = "v1" });
// Define the OAuth2.0 scheme that's in use (i.e., Implicit Flow)
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
Scheme = "bearer",
BearerFormat = "JWT"
});
c.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
new string[] {}
}
});
});
#region Set Global Parameters
DMSSWE.SECURITY.WEBAPI.Common.SecurityConnectionManager.GetSecurityDetails(builder.Configuration["AppSettings:SecurityCfgFilepath"] ?? string.Empty);
#endregion Set Global Parameters
builder.Services.AddHealthChecks().AddCheck<SqlServerHealthCheck>("Sql Server");
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
// Configure the HTTP request pipeline.
app.MapHealthChecks("/health", new HealthCheckOptions
{
ResponseWriter = async (context, report) =>
{
context.Response.ContentType = "application/json";
var result = System.Text.Json.JsonSerializer.Serialize(
new
{
status = report.Status.ToString(),
checks = report.Entries.Select(entry => new
{
name = entry.Key,
status = entry.Value.Status.ToString(),
description = entry.Value.Description
}),
duration = report.TotalDuration
});
await context.Response.WriteAsync(result);
}
});
app.MapControllers();
app.Run();
Привет, Джинуши, я проверил ваш файл Program.cs, он кажется правильным, ошибок нет. Не могли бы вы поделиться полным кодом вашего ReportsController? Если есть какая-либо конфиденциальная информация, вы можете ее скрыть, я просто хочу проверить все методы и атрибуты.
Привет, я уже предоставил полный код контроллера отчетов выше. @Джейсон Пэн
@Джейсон Пэн, это мой полный код контроллера отчетов. Когда я закомментирую первые два метода HttpPost, API загружается без ошибок.
using DMSSWE.SECURITY.WebAPI.Data.Mssql;
using DMSSWE.SECURITY.WebAPI.Data.Oracale;
using DMSSWE.SECURITY.WEBAPI.Common;
using DMSSWE.SECURITY.WebAPI.Data.Interfaces;
using DMSSWE.SECURITY.Models;
using DMSSWE.SECURITY.Reports.Datesets;
using static DMSSWE.SECURITY.Common.Enums;
using DMSSWE.SECURITY.WebAPI.Data.Postgresql;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
namespace DMSSWE.SECURITY.WEBAPI.Controllers
{
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class ReportsController : ControllerBase
{
private readonly IReports _bl;
private readonly string[] connectionValues = new string[2];
public ReportsController()
{
connectionValues[0] = GlobalData.ConnectionString;
connectionValues[1] = GlobalData.ConnectionType.ToString();
switch (Convert.ToInt32(connectionValues[1]))
{
case (int)ConnectionType.MSSQL:
_bl = new ReportsSQL();
break;
case (int)ConnectionType.ORACLE:
_bl = new ReportsORA();
break;
case (int)ConnectionType.POSTGRESQL:
_bl = new ReportsPGSQL();
break;
default:
break;
}
}
[HttpPost]
[Route("PostReportDetails")]
public IActionResult PostReportDetails([FromBody] IREPORTSDTO reports)
{
try
{
bool result = _bl.PostReportDetails(connectionValues, reports);
return this.Ok(result);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpPost]
[Route("PutReportDetails")]
public IActionResult PutReportDetails([FromBody] IREPORTSDTO reports)
{
try
{
bool result = _bl.PutReportDetails(connectionValues, reports);
return this.Ok(result);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("DeleteReportDetails")]
public IActionResult DeleteReportDetails(int moduleId, int functionId, string reportId)
{
try
{
bool result = _bl.DeleteReportDetails(connectionValues, moduleId, functionId, reportId);
return this.Ok(result);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetAllReports")]
public IActionResult GetAllReports(string companyId, string productId, int moduleId, string userId)
{
try
{
List<IREPORTSDTO> reports = _bl.GetAllReports(connectionValues, companyId, productId, moduleId, userId);
return this.Ok(reports);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetReportDetails")]
public IActionResult GetReportDetails(int moduleId, int functionId, string reportId)
{
try
{
IREPORTSDTO report = _bl.GetReportDetails(connectionValues, moduleId, functionId, reportId);
return this.Ok(report);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetSecurityConnection")]
public SECURITYCONNDTO GetSecurityConnection()
{
return GlobalData.SecurityConnection;
}
[HttpGet]
[Route("GetReportSE0001")]
public IActionResult GetReportSE0001(string userId)
{
try
{
RPT_USER_MATRIX ds = _bl.GetReportSE0001(connectionValues, userId);
return this.Ok(ds);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetReportSE0002")]
public IActionResult GetReportSE0002(int accountStatus)
{
try
{
RPT_USER_ACNT_STATUS ds = _bl.GetReportSE0002(connectionValues, accountStatus);
return this.Ok(ds);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetReportSE0003")]
public IActionResult GetReportSE0003(int usrPwdStatus)
{
try
{
RPT_USER_PWD_STATUS ds = _bl.GetReportSE0003(connectionValues, usrPwdStatus);
return this.Ok(ds);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetReportSE0004")]
public IActionResult GetReportSE0004(string userId)
{
try
{
RPT_USER_MATRIX ds = _bl.GetReportSE0004(connectionValues, userId);
return this.Ok(ds);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetReportSE0006")]
public IActionResult GetReportSE0006(string userId)
{
try
{
RPT_USER_MATRIX ds = _bl.GetReportSE0006(connectionValues, userId);
return this.Ok(ds);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetReportSE0007")]
public IActionResult GetReportSE0007(string productId)
{
try
{
RPT_ROLE_MATRIX ds = _bl.GetReportSE0007(connectionValues, productId);
return this.Ok(ds);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetReportSE0008")]
public IActionResult GetReportSE0008(string productId)
{
try
{
RPT_ROLE_MATRIX ds = _bl.GetReportSE0008(connectionValues, productId);
return this.Ok(ds);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetReportSE0010")]
public IActionResult GetReportSE0010(string fromDate, string toDate, string loginUser)
{
try
{
RPT_USER_ID_AUDIT ds = _bl.GetReportSE0010(connectionValues, fromDate, toDate, loginUser);
return this.Ok(ds);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetReportSE0011")]
public IActionResult GetReportSE0011(string fromDate, string toDate, string loginUser)
{
try
{
RPT_UPM_AUDIT ds = _bl.GetReportSE0011(connectionValues, fromDate, toDate, loginUser);
return this.Ok(ds);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetReportSE0012")]
public IActionResult GetReportSE0012(string fromDate, string toDate, string loginUser)
{
try
{
RPT_USER_LOGIN_AUDIT ds = _bl.GetReportSE0012(connectionValues, fromDate, toDate, loginUser);
return this.Ok(ds);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetReportSE0013")]
public IActionResult GetReportSE0013(string fromDate, string toDate, string loginUser)
{
try
{
RPT_USER_ACCESS_AUDIT ds = _bl.GetReportSE0013(connectionValues, fromDate, toDate, loginUser);
return this.Ok(ds);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetReportSE0014")]
public IActionResult GetReportSE0014(string fromDate, string toDate, string loginUser)
{
try
{
RPT_USER_ACTIVITY_AUDIT ds = _bl.GetReportSE0014(connectionValues, fromDate, toDate, loginUser);
return this.Ok(ds);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet]
[Route("GetReportSE0015")]
public IActionResult GetReportSE0015(string loginUser)
{
try
{
RPT_USER_LIST ds = _bl.GetReportSE0015(connectionValues, loginUser);
return this.Ok(ds);
}
catch (Exception)
{
return this.StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
}
Я проверил и не могу воспроизвести, сложно сказать, что произошло? Код правильный. Не могли бы вы поделиться с нами своим файлом .csproj? Нам также необходимо проверить версию пакета.
Спасибо всем, кто предоставил предложения по устранению ошибки «Не удалось загрузить определение API» в моем проекте .NET 8. Я нашел решение проблемы.
Проблема была вызвана тем, что Swagger не поддерживал тип Bitmap в моем DTO. Удалив следующую строку из моего кода, ошибка была устранена:
public Bitmap image { get; set; }
После удаления этой строки пользовательский интерфейс Swagger загрузился правильно, и определение API было успешно отображено.
Еще раз спасибо за вашу помощь и предложения!
Можете ли вы также показать свой код запуска, который настраивает Swagger? Возможно, было бы неплохо создать новый проект WebAPI и сравнить входящий в него код с вашим проектом.