2

Я использую ASP.NET Core 1.0.1. У меня есть следующийЗагрузка и регистрация API-контроллеров из библиотеки классов в ядре ASP.NET

  • библиотека классов, которая использует "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) 
 
     { 
 
     } 
 
    } 
 
}

Это project.json моего класса libray в:

{ 
    "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

Итак, чего не хватает?

+0

Попробуйте заменить 'typeof (ValuesContoller) .GetTypeInfo(). Assembly' для' typeof (ValuesContoller) .Assembly' –

+0

Это недопустимый метод или расширение. – Coding

+0

Этот метод доступен для меня. Можете ли вы обновить свой вопрос с помощью своего полного Startup.cs? –

ответ

2

Может быть, вы делаете что-то неправильно. Итак, вот шаги, чтобы сделать эту работу.

  • Создать новый проект: ASP.NET Core Web Application (.NET Core);
  • Выберите шаблон веб-API;
  • Запустите проект и получите доступ к «api/values», чтобы убедиться, что он работает;
  • Добавить новый проект в решение с именем ClassLibrary: Class Library (.NET Core);
  • Удалите Class1.cs и создайте класс TestController.cs;
  • Добавьте зависимость MVC в project.json от ClassLibrary проекта:

    "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" }; 
        } 
    } 
    
  • Добавить ссылку на ClassLibrary в вашем проекте WebAPI: щелкните правой кнопкой мыши на "Ссылки" -> "Add Reference ..." или обновить 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"))); 
    } 
    
  • Запустите проект снова и доступ к "апи/тест";
+0

Спасибо, Фабрико. Это именно то, что я сделал, и на моей машине есть что-то действительно странное, потому что я внес изменения в свой запуск, а затем верну его обратно к коду в моем вопросе и теперь его работу, но не знаю причины. – Coding

+0

Спасибо Fabricio – damir

1

Вам не нужно ничего делать в Startup.cs основного веб-приложения, ему просто нужно ссылаться на библиотеку классов.

Одна хитрость заключается в том, что для ваших контроллеров, чтобы быть обнаруженными ваша библиотека классов должна напрямую ссылаться на MVC в project.json файл зависимости раздела:

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

UPDATE: для MVC приложения, которое я не сделал ничего особенного в нужен мой запуск, но в одном из моих приложений api мне это понадобилось, возможно, потому, что с помощью маршрутизации атрибутов.

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

где CSharp.WebLib это имя моей библиотеки классов

+0

зависимость уже существует. – Coding

 Смежные вопросы

  • Нет связанных вопросов^_^