Web Api Controller在其他项目中,路由属性不起作用

时间:2014-03-18 09:22:55

标签: c# asp.net-web-api asp.net-web-api2 asp.net-web-api-routing attributerouting

我有两个项目的解决方案。一个Web Api bootstap项目,另一个是类库。

类库包含一个带属性路由的ApiController。 我将web api项目中的引用添加到类库中,并期望它能够正常工作。

配置了web api中的路由:

config.MapHttpAttributeRoutes();

控制器很简单,看起来像:

public class AlertApiController:ApiController
{
    [Route("alert")]
    [HttpGet]
    public HttpResponseMessage GetAlert()
    {
        return Request.CreateResponse<string>(HttpStatusCode.OK,  "alert");
    }
}

但是当我转到网址“/ alert”时我得到了404.

我在这里缺少什么?为什么我不能使用这个控制器?程序集肯定已加载,所以我认为http://www.strathweb.com/2012/06/using-controllers-from-an-external-assembly-in-asp-net-web-api/不是答案。

有什么想法吗?

3 个答案:

答案 0 :(得分:14)

试试这个。在类库项目中创建一个类似于

的类
public static class MyApiConfig {


  public static void Register(HttpConfiguration config) {
      config.MapHttpAttributeRoutes();
  }
}

无论您当前正在呼叫config.MapHttpAttributeRoutes(),请拨打MyApiConfig.Register(config)

答案 1 :(得分:10)

一种可能性是您在具有相同名称的不同控制器上有2条路由。

我有两个名为“UploadController”的控制器,每个控制器位于不同的命名空间中,每个控制器都用不同的[RoutePrefix()]装饰。当我试图访问任一路线时,我得到了404.

当我更改其中一个控制器的名称时,它开始工作了。似乎Route属性仅键入类名并忽略命名空间。

答案 2 :(得分:1)

我们试图解决类似的问题。 外部程序集中的路径未正确注册。 我们在尝试此页面上显示的解决方案时发现了一个额外的细节。 在调用MapHttpRoute之前需要调用外部程序集“MyApiConfig.Register”

HttpConfiguration config = new HttpConfiguration();
MyExternalNamespace.MyApiConfig.Register(config); //This needs to be before the call to "config.Routes.MapHttpRoute(..."
config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );