在不同名称空间中具有相同名称的控制器ASP.NET WEB API

本文关键字:ASP 控制器 NET WEB API 空间 | 更新日期: 2023-09-27 18:27:01

我需要在不同的命名空间中使用相同名称的控制器。我的控制器是:

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中的My Register函数为:

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 调用了这两个函数

有人能帮我吗?我错过了什么?

谢谢,
Priya

在不同名称空间中具有相同名称的控制器ASP.NET WEB API

第二个"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 {...}
}

在你的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 });
}

以上将导致以下工作路线:

  • http://server/api/v1/messages/{action}/{id}
  • http://server/api/v2/messages/{action}/{id}
  • http://server/api/messagesV1/{action}/{id}
  • http://server/api/messagesV2/{action}/{id}
  • http://server/api/{controller}/{action}/}id}

希望能有所帮助!

Steve