Я использую .NET 8.0 в приложении ASP.NET Core.
У меня есть класс следующим образом:
/// Controller for diagram retrieval.
/// </summary>
[Route("api/Projects")]
[ApiController]
[Authorize]
public class ProjectsEndpoints : ControllerBase
{
private IGenesysApiService _apiRequestService;
private AppSettings _appSettings;
public ProjectsEndpoints(IGenesysApiService apiClientService, AppSettings appSettings)
{
_apiRequestService = apiClientService;
_appSettings = appSettings;
}
public async Task<Project> GetProjects()
{
await AddGenesysToken();
var url = _appSettings.GenesysApiURI + "/Projects";
var list = await _apiRequestService.GetAsync<Project>(url);
return list.Body;
}
private async Task AddGenesysToken()
{
var token = await _apiRequestService.GetAccessTokenForUserAsync();
_apiRequestService.RequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token);
}
}
Если я добавлю такую функцию, как:
public async Task<Entity> GetEntitiesByProject(string projectId)
{
try
{
await AddGenesysToken();
var ret = await _apiRequestService.GetAsync<Entity>($"/entities/{projectId}/f5a2162d-74d3-47a0-9b8b-e51d12db78a0");
return ret.Body;
}
catch (Exception ex)
{
return null;
}
}
КОТОРЫЙ Я ДАЖЕ НЕ ВЫЗЫВАЮ, я получаю следующую ошибку при попытке вызвать getprojects().
Если я закомментирую неиспользуемую функцию, она будет работать нормально.
Загружены ресурсы размером 12,51 МБ из кэша. Горячая клавиша отладки: Shift+Alt+D (когда приложение находится в фокусе) Горячая перезагрузка CSS игнорирует https://localhost:44367/_content/Microsoft.FluentUI.AspNetCore.Components/Microsoft.FluentUI.AspNetCore.Components.bundle.scp.css, поскольку он был недоступен или имел более 5000 правил. Зарегистрировано: неудача: Sidekick.Client.Shared.Services.ApiClientService[0] Ошибка сервера. ошибка: Microsoft.AspNetCore.Components.Web.ErrorBoundary[0] System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта. в Sidekick.Client.Features.Projects.Services.ProjectsService.GetProjects() в C:\Source\Sidekick\development\Client\Features\Projects\Services\ProjectsService.cs:строка 23 в Sidekick.Client.Features.Diagram.ProjectListComponent.OnInitializedAsync() в C:\Source\Sidekick\development\Client\Features\Diagram\ProjectListComponent.razor:line 51 в Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync() в Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask (Task TaskToHandle, ComponentState owningComponentState) System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта. в Sidekick.Client.Features.Projects.Services.ProjectsService.GetProjects() в C:\Source\Sidekick\development\Client\Features\Projects\Services\ProjectsService.cs:строка 23 в Sidekick.Client.Features.Diagram.ProjectListComponent.OnInitializedAsync() в C:\Source\Sidekick\development\Client\Features\Diagram\ProjectListComponent.razor:line 51 в Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync() в Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask (Task TaskToHandle, ComponentState owningComponentState)
Я проверил, что получение проектов работает ТОЛЬКО в том случае, если я не добавляю функции в класс. Очень странно. Опять же, единственным изменением, которое я сделал, было добавление в класс функций, которые я еще не вызываю.
Я запускаю отладчик с помощью IIS Express.





Очень странно
На самом деле это не так. Я настоятельно рекомендую ознакомиться с документацией Маршрутизация к действиям контроллера в ASP.NET Core. По сути, вы определили один маршрут для вашего контроллера через:
[Route("api/Projects")]
И из ранее связанных документов:
Определение действия
Публичные методы контроллера, за исключением тех, которые имеют атрибут
NonAction, являются действиями.
Поэтому, когда вы добавляете второй метод, вы получаете два действия, соответствующие одному и тому же маршруту, поэтому, если вы попытаетесь вызвать его напрямую, вы получите что-то вроде следующего:
An unhandled exception occurred while processing the request.
AmbiguousMatchException: The request matched multiple endpoints. Matches:
ProjectsEndpoints.GetProjects (ASPNET8TestApp)
ProjectsEndpoints.GetEntitiesByProject (ASPNET8TestApp)
Вы можете это исправить, выделив для него отдельный маршрут, например:
[Route("api/Projects")]
[ApiController]
public class ProjectsEndpoints : ControllerBase
{
[HttpGet]
public async Task<Project> GetProjects()
{
// ...
}
[HttpGet("{projectId}/entity")]
public async Task<Entity> GetEntitiesByProject(string projectId)
{
// ...
}
}
Это сделает GetEntitiesByProject доступным по пути api/Projects/{someProjIdHere}/entity
Это ответ, я понял, что мне нужно объявить маршруты