【问题标题】:Base controller from another class library doesn't working in web api来自另一个类库的基本控制器在 web api 中不起作用
【发布时间】:2015-08-06 13:18:56
【问题描述】:

我有两个 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'."
}

【问题讨论】:

  • 嘿,在下面查看我的答案。

标签: c# asp.net-web-api controller


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    默认情况下,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/

    【讨论】:

    • 谢谢!!我安装了 Microsoft.AspNet.WebApi.Core 5.1.2 和包 Microsoft.AspNet.WebApi 并修复了它。
    • MapRoute 用于 MVC 路由,而不用于 Web API。
    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 2017-03-01
    • 2012-09-15
    • 2013-08-11
    • 2023-03-12
    • 2013-05-25
    • 1970-01-01
    相关资源
    最近更新 更多