来自另一个类库的基控制器不能在web api中工作
本文关键字:web api 工作 不能 控制器 另一个 类库 | 更新日期: 2023-09-27 18:16:13
我有两个Web API项目,我有一个MarketController
,我需要扩展API控制器,所以我做到了。
我创建了一个BaseController
类,继承ApiController
,像这样:
public class BaseController:ApiController { }
到目前为止一切正常,运行正常:
public class MarketController : BaseController
{
public MarketController() : base()
{
}
// GET api/<controller>
public IEnumerable<string> 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'."
}
无需实现自定义ControllerFactory或AssemblyResolver类。如果您将Microsoft.AspNet.WebApi.Core内核包添加到包含基类的程序集中,则此场景将"刚刚工作"。
在我的例子中,我刚刚添加了一个对System.Web.Http.dll的引用,它可以编译,但是控制器不能正确加载。添加Nuget包后,无需修改代码就能正常工作。
默认情况下,MVC查找MVC应用程序的同一程序集中的所有控制器。默认的控制器工厂基于字符串"ControllerName+ controller"创建控制器实例,比如MarketController,其中market来自url market/actionname。它将在与mvc应用程序相同的程序集中查找MarketController。
要把控制器放在单独的程序集中,你必须创建自己的控制器工厂,或者你必须指定程序集名称为app start。
一旦您创建了您自己的自定义ControllerFactory,您将以下行添加到Application_Start的global。告诉框架在哪里可以找到它:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
或者对于像您这样简单的情况,您可以这样做:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" },
new[] { "BLLAssembly.Controllers" }
);
BLLAssembly。Controllers是BLL程序集中BaseController的命名空间。
还有一种使用自定义程序集解析器的更高级的方法。e IAssembliesResolver
下面的文章还告诉我们如何使用Web Api