具有不同名称空间的相同名称的控制器ASP.NET WEB API
问题描述:
我需要在不同名称空间中具有相同名称的控制器。 时遇到的控制器:具有不同名称空间的相同名称的控制器ASP.NET WEB API
namespace BSB.Messages.Controllers.V1
{
public class MessagesController : ApiController {...}
}
namespace BSB.Messages.Controllers.V2
{
public class MessagesController : ApiController {...}
}
我试图将其配置在启动时。但仍然当我拨打电话时显示错误:
发现多个类型与名为'messages'的控制器相匹配。如果为请求 ('api/{namespace}/{controller}/{action}/{id}')提供服务的路由找到多个 控制器,并且这些控制器使用相同的名称但不同的名称空间定义,则不支持
在WebApiConfig
我的注册功能是:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute("DefaultApi", "api/{namespace}/{controller}/{action}/{id}", new { id = UrlParameter.Optional });
}
我RegisterRoutes
功能是:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
var r = routes.MapRoute(
name: "Default",
url: "v1/messages/{action}/{id}",
defaults: new { id = UrlParameter.Optional },
namespaces: new[] { "BSB.Messages.Controllers.V1" }
);
r.DataTokens["Namespaces"] = new string[] { "BSB.Messages.Controllers.V1" };
var r1 = routes.MapRoute(
name: "V2",
url: "v2/messages/{action}/{id}",
defaults: new { id = UrlParameter.Optional },
namespaces: new[] { "BSB.Messages.Controllers.V2" }
);
r1.DataTokens["Namespaces"] = new string[] { "BSB.Messages.Controllers.V2" };
}
我打过电话从Global.asax中
两个功能中的任何一个可以帮助我在这?我在这里错过了什么?
谢谢,
普里亚
答
第二个 “的RegisterRoutes” 方法仅适用于MVC的控制器不API控制器。应该在WebAPI启动中完成API路由。
该行:config.MapHttpAttributeRoutes();将最适合你,但仍然需要你重新命名你的控制器类。看看这里了解更多关于属性的路由:http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
这就解释了,你可以用定义你的路由属性装饰你的类:
namespace BSB.Messages.Controllers.V1
{
[RoutePrefix("api/v1/messages")]
public class MessagesV1Controller : ApiController {...}
}
namespace BSB.Messages.Controllers.V2
{
[RoutePrefix("api/v2/messages")]
public class MessagesV2Controller : ApiController {...}
}
而在你的WebAPI的启动,你既可以摆脱MapHTTPRoute的电话和只能去属性,或:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute("DefaultApi", "api/v1/messages/{action}/{id}", new { controller = "MessagesV1", id = UrlParameter.Optional });
config.Routes.MapHttpRoute("DefaultApi", "api/v2/messages/{action}/{id}", new { controller = "MessagesV2", id = UrlParameter.Optional });
config.Routes.MapHttpRoute("DefaultApi", "api/{namespace}/{controller}/{action}/{id}", new { id = UrlParameter.Optional });
}
以上会导致以下工作路线:
- http://server/api/v1/messages/ {动作}/{ID}
- http://server/api/v2/messages/ {动作}/{ID}
- http://server/api/messagesV1/ {动作}/{ID}
- http://server/api/messagesV2/ {动作}/{ID}
- http://server/api/ {控制器}/{action}/{id}
希望有帮助!
史蒂夫
试试这个'无功R1 = routes.MapRoute( 名称: “V2”, 网址: “V2 /消息/ {}动作/(编号)”,违约 :新{控制器=” v2“,id = UrlParameter.Optional}, namespaces:new [] {”BSB.Messages.Controllers.V2“} );' – 2016-03-11 05:49:50
该框架清楚地表明它不被支持。 – Nkosi 2016-03-27 20:27:32