it-swarm.dev

ASP.NET 코어의 클래스 라이브러리에서 API 컨트롤러로드 및 등록

ASP.NET Core 1.0.1을 사용하고 있습니다. 나는 다음을 가지고있다

  • 컨트롤러를 개발하기 위해 "Microsoft.AspNetCore.Mvc": "1.0.1"를 사용하는 클래스 라이브러리 :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace CoreAPIsLibrary.Controllers
{

    [Route("api/[controller]")]
    public class ValuesContoller : Controller
    { 
        public string Get()
        {
            return "value";
        }

        // GET api/values/5
        [HttpGet("{id}")]
        public string Get(int id)
        {
            return "value";
        }

        // POST api/values
        [HttpPost]
        public void Post([FromBody]string value)
        {
        }

        // PUT api/values/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody]string value)
        {
        }
    }
}

이것은 내 클래스 libray의 project.json입니다.

{
  "version": "1.0.0-*",

  "dependencies": {
    "Microsoft.AspNetCore.Mvc": "1.0.1",
    "NETStandard.Library": "1.6.0"
  },

  "frameworks": {
    "netstandard1.6": {
      "imports": "dnxcore50"
    }
  }
}
  • 내 컨트롤러를 호스팅하고 해당 클래스 라이브러리를 참조하는 Asp.net 핵심 응용 프로그램 (웹 API 템플릿). 그러나 컨트롤러의 중단 점에 절대 도달하지 않습니다. 웹 응용 프로그램의 시작 클래스는 다음과 같습니다.
  using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System.Reflection;
using CoreAPIsLibrary.Controllers;

namespace APIsHost
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }

        public IConfigurationRoot Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc()
              .AddApplicationPart(typeof(ValuesContoller).GetTypeInfo().Assembly).AddControllersAsServices();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();

            app.UseMvc(routes =>
            {
                routes.MapRoute("default", "{controller}/{action}/{id}");
            });
            //app.UseMvc();
        }
    }
}

또한 컨트롤러가 주입되었는지 확인했습니다.

enter image description here

그래서 무엇이 빠졌습니까?

11
Hussein Salman

어쩌면 당신은 뭔가 잘못하고있을 것입니다. 이 작업을 수행하는 단계는 다음과 같습니다.

  • 새 프로젝트를 만듭니다. ASP.NET Core 웹 응용 프로그램 (.NET Core);
  • 웹 API 템플릿을 선택하십시오.
  • 프로젝트를 실행하고 "api/values"에 액세스하여 작동하는지 확인하십시오.
  • ClassLibrary라는 솔루션에 새 프로젝트를 추가합니다. Class Library (.NET Core);
  • Class1.cs를 삭제하고 TestController.cs 클래스를 작성하십시오.
  • ClassLibrary 프로젝트의 project.json에 MVC 종속성을 추가하십시오.

    "dependencies": {
      "NETStandard.Library": "1.6.0",
      "Microsoft.AspNetCore.Mvc": "1.0.0"
    },
    
  • TestController.cs를 다음과 같이 업데이트하십시오 :

    [Route("api/[controller]")]
    public class TestController : Controller{
      [HttpGet]
      public IEnumerable<string> Get() {
        return new string[] { "test1", "test2" };
      }
    }
    
  • WebAPI 프로젝트에서 ClassLibrary에 대한 참조를 추가하십시오. "참조"-> "참조 추가 ..."를 마우스 오른쪽 단추로 클릭하거나 다음과 같이 project.json을 업데이트하십시오.

    "dependencies": {
      "Microsoft.NETCore.App": {
        "version": "1.0.0",
        "type": "platform"
      },
      "Microsoft.AspNetCore.Mvc": "1.0.0",
      "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
      "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
      "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
      "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
      "Microsoft.Extensions.Configuration.Json": "1.0.0",
      "Microsoft.Extensions.Logging": "1.0.0",
      "Microsoft.Extensions.Logging.Console": "1.0.0",
      "Microsoft.Extensions.Logging.Debug": "1.0.0",
      "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
      "ClassLibrary": "1.0.0-*"
    },
    
  • Startup.cs ConfigureServices 메소드를 업데이트하십시오.

    public void ConfigureServices(IServiceCollection services) {
      services.AddMvc().AddApplicationPart(Assembly.Load(new AssemblyName("ClassLibrary")));
    }
    
  • 프로젝트를 다시 실행하고 "api/test"에 액세스하십시오.
13
Fabricio Koch

기본 웹 앱의 Startup.cs에서 특별한 작업을 수행 할 필요는 없으며 클래스 라이브러리 만 참조하면됩니다.

컨트롤러를 발견하려면 클래스 라이브러리가 project.json 파일 종속성 섹션에서 MVC를 직접 참조해야합니다.

"Microsoft.AspNetCore.Mvc": "1.0.*"

업데이트 : MVC 앱의 경우 시작에 특별한 것이 필요하지 않지만 api 앱 중 하나에서는 속성 라우팅을 사용하기 때문에 필요할 수 있습니다.

services.AddMvc()
            .AddApplicationPart(Assembly.Load(new AssemblyName("CSharp.WebLib")))
            ;

여기서 CSharp.WebLib은 내 클래스 라이브러리의 이름입니다.

5
Joe Audette