来自另一个类库的基控制器不能在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'."
}

来自另一个类库的基控制器不能在web api中工作

无需实现自定义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

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