Проблема: Ошибка 500 — «Не удалось загрузить определение API» в проекте .NET 8

Постановка задачи: Я сталкиваюсь с ошибкой 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» после запуска проекта. Цель: понять причину ошибки и найти способ ее устранения. Что я пробовал

  • Проверка строк подключения: проверено, что GlobalData.ConnectionString и GlobalData.ConnectionType установлены правильно.
  • Внедрение зависимостей: убедитесь, что внедрение зависимостей правильно настроено в Program.cs.
  • Авторизация: проверено, что атрибут [Authorize] правильно используется и настроен.

Будем очень признательны за любые идеи или предложения о том, как решить эту проблему. Заранее спасибо за вашу помощь!

Можете ли вы также показать свой код запуска, который настраивает Swagger? Возможно, было бы неплохо создать новый проект WebAPI и сравнить входящий в него код с вашим проектом.

Meligy 20.05.2024 10:56

Кажется, код в вашем контроллере отчетов не полностью? Мог бы поделиться всеми методами в этом контроллере.

Jason Pan 20.05.2024 10:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
97
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

@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? Если есть какая-либо конфиденциальная информация, вы можете ее скрыть, я просто хочу проверить все методы и атрибуты.

Jason Pan 20.05.2024 16:06

Привет, я уже предоставил полный код контроллера отчетов выше. @Джейсон Пэн

Jinushi Rajapaksha 21.05.2024 03:05

@Джейсон Пэн, это мой полный код контроллера отчетов. Когда я закомментирую первые два метода 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? Нам также необходимо проверить версию пакета.

Jason Pan 21.05.2024 09:22
Ответ принят как подходящий

Спасибо всем, кто предоставил предложения по устранению ошибки «Не удалось загрузить определение API» в моем проекте .NET 8. Я нашел решение проблемы.

Проблема была вызвана тем, что Swagger не поддерживал тип Bitmap в моем DTO. Удалив следующую строку из моего кода, ошибка была устранена:

public Bitmap image { get; set; }

После удаления этой строки пользовательский интерфейс Swagger загрузился правильно, и определение API было успешно отображено.

Еще раз спасибо за вашу помощь и предложения!

Другие вопросы по теме