来自另一个类库的基本控制器在web api中不起作用

我有两个Web API项目,我有一个MarketController ,我需要扩展Api控制器,所以我做到了。

我创建了一个BaseController类,并inheritance自ApiController如下所示:

 public class BaseController:ApiController { } 

到目前为止一切顺利,它运作良好:

 public class MarketController : BaseController { public MarketController() : base() { } // GET api/ public IEnumerable Get() { return new string[] { "value1", "value2" }; } } 

但我想在另一个名为BLL类库中执行此操作,因此我将BaseController类移动到BLL类库,并在Web API项目中引用它。

当我这样做时,api停止了工作。

回应是:

 { "Message": "No HTTP resource was found that matches the request URI someurl/api/market.", "MessageDetail": "No type was found that matches the controller named 'market'." } 

默认情况下,MVC在mvc应用程序的同一程序集中查找所有控制器。 默认控制器工厂基于字符串’ControllerName + Controller’创建控制器实例,如MarketController,其中市场来自url market / actionname 。它将在与mvc应用程序相同的程序集中查找MarketController。

要将控制器置于单独的程序集中,您必须创建自己的控制器工厂,或者必须指定程序集名称是app start。

一旦您创建了自己的自定义ControllerFactory,就可以在global.asax中将以下行添加到Application_Start,以告诉框架在哪里找到它:

 ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory()); 

或者对于像你这样的简单案例你可以这样做:

 routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" }, new[] { "BLLAssembly.Controllers" } ); 

这里BLLAssembly.Controllers是BLL程序集中BaseController的命名空间。

还有一种使用自定义程序集解析器的高级方法,即IAssembliesResolver下面的文章介绍了如何使用Web Api执行此操作,

http://www.strathweb.com/2012/06/using-controllers-from-an-external-assembly-in-asp-net-web-api/

无需实现自定义ControllerFactory或AssemblyResolver类。 如果将Microsoft.AspNet.WebApi.Core nuget包添加到包含基类的程序集,则此方案将“正常工作”。

在我的情况下,我刚刚添加了对将编译的System.Web.Http.dll的引用,但控制器将无法正确加载。 添加Nuget包使一切正常,无需更改代码。