C# 从ASP.NET core中的类库加载和注册API控制器

C# 从ASP.NET core中的类库加载和注册API控制器,c#,asp.net-mvc,asp.net-core,asp.net-core-mvc,asp.net-core-webapi,C#,Asp.net Mvc,Asp.net Core,Asp.net Core Mvc,Asp.net Core Webapi,我正在使用ASP.NET Core 1.0.1。我有以下几点 使用“Microsoft.AspNetCore.Mvc”:“1.0.1”开发控制器的类库: 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用System.Threading.Tasks; 使用Microsoft.AspNetCore.Mvc; 命名空间CoreAPIsLibrary.Controllers { [路由(“api/[控制器]”)] 公共类值构造函数:控制器

我正在使用ASP.NET Core 1.0.1。我有以下几点

  • 使用
    “Microsoft.AspNetCore.Mvc”:“1.0.1”
    开发控制器的类库:
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
使用Microsoft.AspNetCore.Mvc;
命名空间CoreAPIsLibrary.Controllers
{
[路由(“api/[控制器]”)]
公共类值构造函数:控制器
{ 
公共字符串Get()
{
返回“值”;
}
//获取api/values/5
[HttpGet(“{id}”)]
公共字符串Get(int-id)
{
返回“值”;
}
//后api/值
[HttpPost]
公共作废帖子([FromBody]字符串值)
{
}
//将api/values/5放入
[HttpPut(“{id}”)]
公共void Put(int id,[FromBody]字符串值)
{
}
}

}
您不需要在主web应用程序的Startup.cs中执行任何特殊操作,它只需要引用类库

一个技巧是,要发现控制器,类库必须直接引用其project.json文件依赖项部分中的MVC:

"Microsoft.AspNetCore.Mvc": "1.0.*"
更新:对于MVC应用程序,我在启动时不需要任何特别的东西,但在我的一个api应用程序中,我确实需要它,可能是因为使用了属性路由

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

其中CSharp.WebLib是我的类库的名称

也许你做错了什么。因此,以下是实现这一目标的步骤

  • 创建新项目:ASP.NET核心Web应用程序(.NET核心)
  • 选择webapi模板
  • 运行项目并访问“api/值”,以确保其正常工作
  • 向名为ClassLibrary的解决方案添加新项目:类库(.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" };
      }
    }
    
    "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/测试” 法布里西奥·科赫

    如果我在dotnet 5中发布启用修剪选项,它如何处理以下代码

    public void配置服务(IServiceCollection服务){
    services.AddMvc().AddApplicationPart(Assembly.Load(新的AssemblyName(“ClassLibrary”));
    }
    
    尝试替换
    typeof(valuescontoler).GetTypeInfo().Assembly
    for
    typeof(valuescontoler)。Assembly
    这不是有效的方法或扩展。我可以使用此方法。你能用完整的Startup.cs更新你的问题吗?试着在你的控制器中插入
    [Route(“api/[controller]”])
    。另外,尝试在应用程序的同一程序集中创建一个控制器,以确保MVC正常工作。我在程序集中创建了一个控制器,但没有正常工作。我没想到。怎么了?谢谢,法布里科。这正是我所做的,我的机器上有一些非常奇怪的东西,因为我在启动时做了一个更改,然后将它返回到问题中的代码,现在它工作了,但不知道原因。我希望我在几个小时前找到这个答案。这会节省我很多时间。有时它归结为特定的搜索词。很好。这与其他响应完全相同,您正在从类型返回完整的程序集。。。
    // 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(Namespace.SubNamespace.ControllerName).Assembly);
    
        ...
    }