서비스를 등록하지 않은 웹 API asp.net mvc6 앱의 예외

판 티루 가브리엘

asp.net MVC6 프로젝트에서 작업 중이며 웹 API에 문제가 있습니다. 특정 API를 테스트 할 때 내부 오류 (500 http 응답 코드)가 발생합니다.

조사한 결과 서비스에서 얻으려는 개체를 등록하지 않았다는이 오류를 발견했습니다.

'DotnetProject.BusinessLayer.Implementation.QuerryHandlers.GetTestByIdQueryHandler'유형에 대한 서비스가 등록되지 않았습니다.

문제는 내 컨트롤러가 [FromServices]구문을 사용 하여 IoC 컨테이너에서 특정 개체를 요청하고 해당 서비스를 등록하지 않았다는 예외가 발생한다는 것입니다.

서비스에서 해당 개체를 요청하지 않으면 더 이상 내부 오류가 발생하지 않습니다.

[FromServices]구문이 있는 객체를 요청하는 모든 API 함수에 대해 해당 오류가 발생 합니다. 그래서 문제는 어딘가에 있지만 알아낼 수 없습니다.

내 컨트롤러 클래스는 다음과 같습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DotnetProject.BusinessLayer.Interfaces;
using DotnetProject.DataLayer.Domain_Entities;
using DotnetProject.DataLayer.Interfaces;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using DotnetProject.BusinessLayer.Implementation.Queries.Users;
using DotnetProject.BusinessLayer.Implementation.QuerryHandlers.Users;
using DotnetProject.BusinessLayer.Implementation.QuerryResults.Users;
using DotnetProject.BusinessLayer.Implementation.Queries;
using DotnetProject.BusinessLayer.Implementation.QuerryHandlers;
using DotnetProject.BusinessLayer.Implementation.Commands.Users;
using DotnetProject.BusinessLayer.Implementation.CommandHandlers.Users;
using DotnetProject.BusinessLayer.Implementation.Commands;
using DotnetProject.BusinessLayer.Implementation.CommandHandlers;

// For more information on enabling Web API for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860

namespace DotnetProject.Controllers.Api
{
    [Route("api/[controller]")]
    [AllowAnonymous]
    public class TestController : Controller
    {

        private ITestRepository testRepository;
        private ITestService testService;

        public TestController(ITestRepository _testRepository,ITestService _testService)
        {
            testRepository = _testRepository;
            testService = _testService;
        }

        // GET: api/values
        [HttpGet]
        [Route("getAllTests")]
        public GetAllTestsQueryResult GetAll([FromServices] GetAllTestsQueryHandler handler)
        {
            return handler.Retrieve(new GetAllTestsQuery());

        }

        // GET api/values/5
        [HttpGet]
        [Route("getTest")]
        public GetTestByIdQueryResult GetTest([FromServices]GetTestByIdQueryHandler handler,GetTestByIdQuery query)
        {
            return handler.Retrieve(query);   
        }


        // DELETE api/values/5
        [HttpPost]
        [Route("delete")]
        public void Delete(DeleteTestCommand command,[FromServices]DeleteTestHandler handler)
        {
            handler.Execute(command);
        }

        [HttpPost]
        [Route("add")]
        public void AddTest(AddTestCommand command, [FromServices]AddTestHandler handler) {
            handler.Execute(command);
        }
        [HttpPost]
        [Route("update")]
        public void UpdateTest(UpdateTestCommand command,[FromServices]UpdateTestHandler handler) {

            handler.Execute(command);
        }
    }


}

다음은 "등록되지 않음"으로 표시되는 개체 예입니다.

using AT.Core.Cqrs;
using DotnetProject.BusinessLayer.Implementation.Commands.Users;
using DotnetProject.DataLayer;
using DotnetProject.DataLayer.Domain_Entities;
using DotnetProject.DataLayer.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace DotnetProject.BusinessLayer.Implementation.CommandHandlers.Users
{
    public class AddTestHandler : ICommandHandler<AddTestCommand>
    {
        private ITestRepository _testRepository;

        public AddTestHandler(ITestRepository testRepository)
        {
            _testRepository = testRepository;
        }

        public void Execute(AddTestCommand newTest)
        {
            Test test = new Test();
            test.Id = newTest.Id;
            test.QuestionList = newTest.QuestionList;
            test.TestDuration = newTest.TestDuration;
            _testRepository.Add(test);
        }
    }
}

다음은 시작 파일의 ConfigureServices 함수입니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("CorsPolicy",
            builder => builder.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials());
    });
    // Add framework services.
    services.AddApplicationInsightsTelemetry(Configuration);
    services.AddScoped<IUserService, UserService>();
    services.AddScoped<IUserRepository, UserRepository>();
    services.AddScoped<ITestRepository, TestRepository>();
    services.AddScoped<ITestService, TestService>();
    services.AddScoped<IRoleService, RoleService>();
    services.AddScoped<IRoleRepository, RoleRepository>();
    services.AddScoped<ICommandHandler<DeleteUserCommand>, DeleteUserHandler>();
    services.AddScoped<ICommandHandler<UpdateUserCommand>,UpdateUserHandler>();
    services.AddScoped<ICommandHandler<AddUserCommand>, AddUserHandler>();
    services.AddScoped<ICommandHandler<DeleteTestCommand>, DeleteTestHandler>();
    services.AddScoped<ICommandHandler<UpdateTestCommand>, UpdateTestHandler>();
    services.AddScoped<ICommandHandler<AddTestCommand>, AddTestHandler>();
    services.AddScoped<IQueryHandler<GetAllTestsQuery,GetAllTestsQueryResult>,GetAllTestsQueryHandler>();
    services.AddScoped<IQueryHandler<GetTestByIdQuery, GetTestByIdQueryResult>,GetTestByIdQueryHandler>();
    services.AddScoped<IQueryHandler<GetAllUsersQuery, GetAllUsersQueryResult>, GetAllUsersQueryHandler>();
    services.AddScoped<IQueryHandler<GetUserByIdQuery, GetUserByIdQueryResult>, GetUserByIdQueryHandler>();

    services.AddDbContext<ApplicationContext>();
    services.AddMvc(config =>
    {
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
        config.Filters.Add(new AuthorizeFilter(policy));
        config.OutputFormatters.Clear();
        config.OutputFormatters.Add(new JsonOutputFormatter(new JsonSerializerSettings()
        {
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
        }, ArrayPool<char>.Shared));
    });

    services.AddMvc();

    // Inject an implementation of ISwaggerProvider with defaulted settings applied
    services.AddSwaggerGen();
}
Nkosi

에 기초하여 ConfigureServices, 예에서 GetTestByIdQueryHandler was not registered. 인터페이스 IQueryHandler<GetTestByIdQuery, GetTestByIdQueryResult>가 등록되어있을 때 GetTestByIdQueryHandler. 차이가 있고 쉽게 오해됩니다.

DI 컨테이너는 GetTestByIdQueryHandler직접 해결하라는 요청을받을 때 수행 할 작업을 인식하지 못합니다 .

따라서 서비스를

services.AddScoped<GetTestByIdQueryHandler, GetTestByIdQueryHandler>();

처리 방법을 알 수 있도록 GetTestByIdQueryHandler

또는

DI 컨테이너가 인식하는 유형을 호출하도록 조치를 업데이트하십시오.

// GET api/values/5
[HttpGet]
[Route("getTest")]
public GetTestByIdQueryResult GetTest([FromServices]IQueryHandler<GetTestByIdQuery, GetTestByIdQueryResult> handler,GetTestByIdQuery query)
{
    return handler.Retrieve(query);   
}

이상적으로 인터페이스는 몇 가지 규칙을 따라야합니다.

public interface IGetTestByIdQueryHandler : IQueryHandler<GetTestByIdQuery, GetTestByIdQueryResult> {

}

public class GetTestByIdQueryHandler : IGetTestByIdQueryHandler {
    //...
}

그에 따라 등록

services.AddScoped<IGetTestByIdQueryHandler, GetTestByIdQueryHandler>();

그리고 깨끗하게 해결

// GET api/test/getTest
[HttpGet]
[Route("getTest")]
public GetTestByIdQueryResult GetTest([FromServices]IGetTestByIdQueryHandler handler, GetTestByIdQuery query) {
    return handler.Retrieve(query);   
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ASP.NET MVC6 웹 API의 개체 목록을 포함하는 ObjectResult

분류에서Dev

Linux의 ASP.Net Core Web API에서 처리되지 않은 예외

분류에서Dev

ASP.NET 웹 API 2 : 예외 처리기 및 로거가 모든 오류를 처리하지 않음

분류에서Dev

ASP.net MVC6 웹 사이트에서 Office Interop 사용

분류에서Dev

MVC6 / ASP.net ViewModel 문제 (개체 참조가 개체의 인스턴스로 설정되지 않음)

분류에서Dev

하나의 서버에 여러 웹 앱 (Silverlight 및 ASP.NET MVC)

분류에서Dev

Backgroundworker를 사용하는 ASP.NET 웹 서비스의 폴링 서비스가 계속되지 않습니다.

분류에서Dev

ASP.NET MVC4 웹 API에서 정의되지 않은 API 메서드 호출을 포착하는 방법

분류에서Dev

웹 API를 호출하는 ASP .Net Core 웹 앱

분류에서Dev

asp.net 웹 API에서 HTTP를 찾을 수 없음 사용자 지정 예외

분류에서Dev

ASP.net 5.0 (MVC6)에서 REST API에 대한 요청을 수행하는 방법

분류에서Dev

Asp.net 웹 응용 프로그램과 Asp.net 웹 API2 간의 세션 공유 (Asp.net 웹 API2는 하나의 구성에 액세스하는 Asp.net 웹 앱에서 호스팅 됨)

분류에서Dev

asp.net C #은 웹 서비스가 게시되지 않도록합니다.

분류에서Dev

Razor ASP.NET MVC6에서 예상되는 구문 오류 ','

분류에서Dev

NHibernate 및 ASP.NET 웹 API 서비스의 LazyLoad

분류에서Dev

Asp.net 웹 API 서비스

분류에서Dev

ASP.NET MVC 웹 API 기본 포스트가 Angular를 바인딩하지 않음

분류에서Dev

ASP의 비동기 웹 서비스. NET MVC

분류에서Dev

통합 테스트의 사용자 지정 WebApplicationFactory가 Startup.cs (ASP.NET Core 3.1)에 서비스를 등록하지 않음

분류에서Dev

웹 모델이 asp.net mvc에 정의를 포함하지 않습니다.

분류에서Dev

IIS에서 ASP.NET MVC 6 웹 API 실행

분류에서Dev

기존 서비스를 호출하는 새로운 웹 사이트를위한 최상의 아키텍처 (인증 및 권한이있는 ASP.NET 웹 API)

분류에서Dev

ASP.Net Core-IISHttpServer.HandleRequest의 예기치 않은 예외

분류에서Dev

동일한 페이지를 새로 고쳐 asp.net mvc5 웹 앱의 현재 현지화 문화를 변경하는 방법은 무엇입니까?

분류에서Dev

WCF 웹 서비스를 등록하면 ASP.Net HTML 웹 양식 라우팅이 중단됩니다.

분류에서Dev

ASP.net MVC 웹 API + Android

분류에서Dev

C # ASP.Net : WSDL 또는 프록시 클래스를 사용하지 않고 .NET 4.0 C #에서 웹 서비스를 호출하는 방법

분류에서Dev

ASP .NET MVC 웹 서비스 및 PostRepository

분류에서Dev

ASP.NET Core의 웹 서비스를 IIS에 게시하는 방법

Related 관련 기사

  1. 1

    ASP.NET MVC6 웹 API의 개체 목록을 포함하는 ObjectResult

  2. 2

    Linux의 ASP.Net Core Web API에서 처리되지 않은 예외

  3. 3

    ASP.NET 웹 API 2 : 예외 처리기 및 로거가 모든 오류를 처리하지 않음

  4. 4

    ASP.net MVC6 웹 사이트에서 Office Interop 사용

  5. 5

    MVC6 / ASP.net ViewModel 문제 (개체 참조가 개체의 인스턴스로 설정되지 않음)

  6. 6

    하나의 서버에 여러 웹 앱 (Silverlight 및 ASP.NET MVC)

  7. 7

    Backgroundworker를 사용하는 ASP.NET 웹 서비스의 폴링 서비스가 계속되지 않습니다.

  8. 8

    ASP.NET MVC4 웹 API에서 정의되지 않은 API 메서드 호출을 포착하는 방법

  9. 9

    웹 API를 호출하는 ASP .Net Core 웹 앱

  10. 10

    asp.net 웹 API에서 HTTP를 찾을 수 없음 사용자 지정 예외

  11. 11

    ASP.net 5.0 (MVC6)에서 REST API에 대한 요청을 수행하는 방법

  12. 12

    Asp.net 웹 응용 프로그램과 Asp.net 웹 API2 간의 세션 공유 (Asp.net 웹 API2는 하나의 구성에 액세스하는 Asp.net 웹 앱에서 호스팅 됨)

  13. 13

    asp.net C #은 웹 서비스가 게시되지 않도록합니다.

  14. 14

    Razor ASP.NET MVC6에서 예상되는 구문 오류 ','

  15. 15

    NHibernate 및 ASP.NET 웹 API 서비스의 LazyLoad

  16. 16

    Asp.net 웹 API 서비스

  17. 17

    ASP.NET MVC 웹 API 기본 포스트가 Angular를 바인딩하지 않음

  18. 18

    ASP의 비동기 웹 서비스. NET MVC

  19. 19

    통합 테스트의 사용자 지정 WebApplicationFactory가 Startup.cs (ASP.NET Core 3.1)에 서비스를 등록하지 않음

  20. 20

    웹 모델이 asp.net mvc에 정의를 포함하지 않습니다.

  21. 21

    IIS에서 ASP.NET MVC 6 웹 API 실행

  22. 22

    기존 서비스를 호출하는 새로운 웹 사이트를위한 최상의 아키텍처 (인증 및 권한이있는 ASP.NET 웹 API)

  23. 23

    ASP.Net Core-IISHttpServer.HandleRequest의 예기치 않은 예외

  24. 24

    동일한 페이지를 새로 고쳐 asp.net mvc5 웹 앱의 현재 현지화 문화를 변경하는 방법은 무엇입니까?

  25. 25

    WCF 웹 서비스를 등록하면 ASP.Net HTML 웹 양식 라우팅이 중단됩니다.

  26. 26

    ASP.net MVC 웹 API + Android

  27. 27

    C # ASP.Net : WSDL 또는 프록시 클래스를 사용하지 않고 .NET 4.0 C #에서 웹 서비스를 호출하는 방법

  28. 28

    ASP .NET MVC 웹 서비스 및 PostRepository

  29. 29

    ASP.NET Core의 웹 서비스를 IIS에 게시하는 방법

뜨겁다태그

보관