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);
}
}
希望对您有所帮助。
基本上我无法让我的 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);
}
}
希望对您有所帮助。