Asp.net mvc 具有属性路由的Web API 2获取相同密钥错误

Asp.net mvc 具有属性路由的Web API 2获取相同密钥错误,asp.net-mvc,asp.net-web-api,asp.net-mvc-5,attributerouting,Asp.net Mvc,Asp.net Web Api,Asp.net Mvc 5,Attributerouting,为什么我总是在下面得到关于重复密钥的错误?在我尝试属性路由之前,它工作得很好,但现在不行。如果我删除{id:int}它总是命中第二个方法,而不是第一个,即使没有提供id 事件控制器 [System.Web.Http.RoutePrefix("api/v1/events")] public partial class EventsController : System.Web.Http.ApiController { [System.Web.Http.Route("

为什么我总是在下面得到关于重复密钥的错误?在我尝试属性路由之前,它工作得很好,但现在不行。如果我删除
{id:int}
它总是命中第二个方法,而不是第一个,即使没有提供id

事件控制器

[System.Web.Http.RoutePrefix("api/v1/events")]
    public partial class EventsController : System.Web.Http.ApiController
    {
        [System.Web.Http.Route("")]
        public virtual ApiEventsResponse Get([FromUri] ApiEventsRequest request)
        {
            .....

            return response;
        }

        [System.Web.Http.Route("{id:int}")]
        public virtual ApiEventResponse Get(int id, [FromUri] ApiEventRequest request)
        {
            .....

            return response;
        }
访问/api/v1/events时出错?id=12315

Server Error in '/' Application.

An item with the same key has already been added.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentException: An item with the same key has already been added.

Source Error: 


Line 407:            AreaRegistration.RegisterAllAreas();
Line 408:
Line 409:            GlobalConfiguration.Configure(WebApiConfig.Register);
Line 410:            RegisterRoutes(RouteTable.Routes);
Line 411:

Source File: f:\My Webs\BasketballTournaments\MainBranch\Websites\Tournaments\Global.asax.cs    Line: 409 

Stack Trace: 


[ArgumentException: An item with the same key has already been added.]
   System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) +52
   System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) +11187358
   System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) +10
   System.Web.Http.Routing.InlineRouteTemplateParser.ParseRouteTemplate(String routeTemplate, IDictionary`2 defaults, IDictionary`2 constraints, IInlineConstraintResolver constraintResolver) +363
   System.Web.Http.Routing.HttpRouteBuilder.BuildParsingRoute(String routeTemplate, Int32 order, IEnumerable`1 actions) +86
   System.Web.Http.HttpConfigurationExtensions.MapHttpAttributeRoutesInternal(HttpConfiguration configuration, HttpRouteBuilder routeBuilder) +232
   System.Web.Http.<>c__DisplayClass5.<MapHttpAttributeRoutes>b__4() +13
   System.Web.Http.Routing.RouteCollectionRoute.EnsureInitialized(Func`1 initializer) +70
   System.Web.Http.<>c__DisplayClass5.<MapHttpAttributeRoutes>b__3(HttpConfiguration config) +63
   System.Web.Http.HttpConfiguration.EnsureInitialized() +23
   System.Web.Http.GlobalConfiguration.Configure(Action`1 configurationCallback) +57
   Tournaments.MvcApplication.OnApplicationStarted() in f:\My Webs\BasketballTournaments\MainBranch\Websites\Tournaments\Global.asax.cs:409
   Ninject.Web.Common.NinjectHttpApplication.Application_Start() in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\NinjectHttpApplication.cs:82

[HttpException (0x80004005): An item with the same key has already been added.]
   System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +9903113
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +118
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +172
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +336
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +296

[HttpException (0x80004005): An item with the same key has already been added.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9882460
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +101
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +254

没有答案,但我只是回到了我原来的答案。我认为最初的问题是我有两个api,因为您无法为web api路由命名,但存在重复的关键问题,因为
EventsController
列出了两次,但在不同的名称空间下。这是重复键的问题,但是对于
{id:int}
从未为查询字符串工作的问题,您得到了我

routes.MapHttpRoute(
            "DefaultApi",
            "api/v{version}/{controller}/{id}", 
            new { id = RouteParameter.Optional, version = 1 }
        );

        routes.MapHttpRoute(
            "DefaultApiAction",
            "api/v{version}/{controller}/{action}"
        );

基于您上面提供的控制器,我尝试重新编程,但无法…您能否共享此控制器中其余操作的骨架结构?从错误消息中,似乎正在将同一密钥添加到字典中…您可以共享完整堆栈跟踪吗?添加了完整堆栈跟踪。谢谢Mike..您可以共享您的WebApiConfig.cs的外观吗…从错误看,您似乎正在尝试将名为
int
的新内联约束添加到字典中..是吗?添加了WebApiConfig.cshmm,非常奇怪..我无法根据上面的信息重现您的问题…堆栈跟踪清楚地表明,在向字典添加重复密钥时发生异常…如果您注释掉具有
{id:int}的路由,您的应用程序是否正常工作
?…我唯一的猜测是,
MapHttpAttribute路由
可能会被多次调用…我从堆栈跟踪中看到Ninject,想知道它是否通过多次调用配置来做一些奇怪的事情…顺便说一句,内联约束仅适用于非查询字符串路由数据。。。
routes.MapHttpRoute(
            "DefaultApi",
            "api/v{version}/{controller}/{id}", 
            new { id = RouteParameter.Optional, version = 1 }
        );

        routes.MapHttpRoute(
            "DefaultApiAction",
            "api/v{version}/{controller}/{action}"
        );