Web Api 2 Inheritance 找不到提供控制器名称的路由来匹配请求 URI

Web Api 2 Inheritance No route providing a controller name was found to match request URI

基本上我无法让我的 Web Api 2 应用程序工作。 首先,这是我的要求。 在我的应用程序中,我创建了十几个控制器(ProductController、ItemController、SalesController 等)。有 2 个动作在我的所有控制器中绝对常见:

FetchData、PostData

(每个控制器然后可以实现许多其他方法,这些方法是特定于其业务领域的)

而不是在每个控制器中重复这些操作,例如:

public class ProductController:ApiController{
   [HttpPost]
   public MyReturnJson FetchData( MyJsonInput Input){
       ....
       return myJsonResult;
   }
}

public class SalesController:ApiController{
   [HttpPost]
   public MyReturnJson FetchData( MyJsonInput Input){
       ....
       return myJsonResult;
   }
}

我决定创建一个基本控制器 MyBaseController:

public class MyBaseController : ApiController{
   [HttpPost]
   public MyReturnJson FetchData( MyJsonInput Input){
       ....
       return myJsonResult;
   }
}

使用这 2 种方法,这样每个其他控制器都会继承它们(这样我就不用在每个控制器中重复它们了)。公共基础 class 已在单独的程序集中定义和实现,然后在我的 Web 项目中引用。

然后在我的 javascript 客户端中(使用 breeze)我调用一个特定的控制器,例如

breeze.EntityQuery.from('FetchData')

我的服务名称是 'my_api/product/' (在 WebApiConfig 中,路由 table 定义如下:

config.Routes.MapHttpRoute(
            name: "my_api",
            routeTemplate: "my_api/{controller}/{action}"                
        );

但是当执行 javascript 代码时,我收到错误消息:

找不到提供与请求 URI 匹配的控制器名称的路由 http://localhost:xxxxx/my_api/product/FetchData

如果我不使用公共基础 class 而是在每个 class 中重复此方法 (FetchData)(基本上 ProductController 直接继承自 ApiController 而不是 MyBaseController ) 一切正常,我的方法成功了。我认为继承方案存在问题。也许有些东西我没有得到(第一次使用 Web Api 2)或一些限制(路由、配置...)我不尊重。现在我被困住了,我将不胜感激任何可能为我指明正确方向的建议。 Web 中是否允许继承 Api 2?

我不确定为什么您的代码不起作用。不过在接下来的link(http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-22#ARI)中可以看到使用属性路由继承的例子

这是代码示例:

public class BaseController : ApiController
{
    [Route("{id:int}")]
    public string Get(int id)
    {
        return "Success:" + id;
    }
}
[RoutePrefix("api/values")]
public class ValuesController : BaseController
{
}

config.MapHttpAttributeRoutes(new CustomDirectRouteProvider());
public class CustomDirectRouteProvider : DefaultDirectRouteProvider
{
    protected override IReadOnlyList<IDirectRouteFactory> 
    GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
    {
        return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>
        (inherit: true);
    }
}

希望对您有所帮助。