Pri*_*iya 8 c# routes asp.net-web-api asp.net-web-api-routing
我需要在不同的命名空间中具有相同名称的控制器.我拥有的控制器是:
namespace BSB.Messages.Controllers.V1
{
public class MessagesController : ApiController {...}
}
namespace BSB.Messages.Controllers.V2
{
public class MessagesController : ApiController {...}
}
Run Code Online (Sandbox Code Playgroud)
我尝试在启动时配置它.但是当我打电话时,它显示错误:
找到了多个匹配名为"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 });
}
Run Code Online (Sandbox Code Playgroud)
我的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" };
}
Run Code Online (Sandbox Code Playgroud)
我从Global.asax调用了这两个函数
任何人都可以帮助我吗?我错过了什么?
谢谢,
Priya
第二个“RegisterRoutes”方法仅适用于 MVC 控制器而不适用于 API 控制器。API 路由应该在 WebAPI 启动时完成。
该行: 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 {...}
}
Run Code Online (Sandbox Code Playgroud)
在您的 WebApi 启动中,您可以摆脱 MapHTTPRoute 调用并仅使用 go 属性,或者:
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 });
}
Run Code Online (Sandbox Code Playgroud)
以上将导致以下工作路线:
希望有帮助!
史蒂夫