2014-01-22 26 views
1

我剛將Web API幫助頁面升級到版本2.1。當我試圖打開幫助頁面,我得到這個錯誤:Web API幫助頁面發出「已添加具有相同密鑰的項目」

[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) +10695474 
System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) +10 
System.Web.Http.Description.ApiExplorer.TryExpandUriParameters(IHttpRoute route, HttpParsedRoute parsedRoute, ICollection`1 parameterDescriptions, String& expandedRouteTemplate) +407 
System.Web.Http.Description.ApiExplorer.PopulateActionDescriptions(HttpActionDescriptor actionDescriptor, IHttpRoute route, String localPath, Collection`1 apiDescriptions) +258 
System.Web.Http.Description.ApiExplorer.ExploreDirectRoute(HttpControllerDescriptor controllerDescriptor, CandidateAction[] candidates, IHttpRoute route) +358 
System.Web.Http.Description.ApiExplorer.InitializeApiDescriptions() +410 
System.Lazy`1.CreateValue() +416 
System.Lazy`1.LazyInitValue() +152 
System.Lazy`1.get_Value() +75 
System.Web.Http.Description.ApiExplorer.get_ApiDescriptions() +40 
CobaWebApi.Areas.HelpPage.HelpPageConfigurationExtensions.GetHelpPageApiModel(HttpConfiguration config, String apiDescriptionId) in e:\SPIKES\CobaWebApi\Areas\HelpPage\HelpPageConfigurationExtensions.cs:224 
CobaWebApi.Areas.HelpPage.Controllers.HelpController.Api(String apiId) in e:\SPIKES\CobaWebApi\Areas\HelpPage\Controllers\HelpController.cs:38 
lambda_method(Closure , ControllerBase , Object[]) +180 
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +59 
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +435 
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +60 
System.Web.Mvc.Async.ActionInvocation.InvokeSynchronousActionMethod() +76 
System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +36 
System.Web.Mvc.Async.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) +73 
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +136 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102 
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +49 
System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +117 
System.Web.Mvc.Async.<>c__DisplayClass48.<InvokeActionMethodFilterAsynchronouslyRecursive>b__41() +323 
System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +44 
System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +47 
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +136 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102 
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +50 
System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +72 
System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +185 
System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +42 
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +133 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56 
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +40 
System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +34 
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70 
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +44 
System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +39 
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +62 
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 
System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +39 
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +39 
System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +39 
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70 
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +40 
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38 
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9628972 
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 

我已經找到了問題的這兩個控制器操作:

public class MyController : ApiController 
{ 
    /// <summary> 
    /// a quick brown fox 
    /// </summary> 
    /// <param name="request"></param> 
    /// <returns></returns> 
    [HttpGet] 
    [ResponseType(typeof(OneResponse))] 
    [Route("api/stuff/{Id}")] 
    public IHttpActionResult GetOne([FromUri] OneRequest request) 
    { 
     return Ok(new OneResponse()); 
    } 

    /// <summary> 
    /// lazy dog 
    /// </summary> 
    /// <param name="request"></param> 
    /// <returns></returns> 
    [HttpGet] 
    [ResponseType(typeof(ManyResponse))] 
    [Route("api/stuff")] 
    public IHttpActionResult GetMany([FromUri] ManyRequest request) 
    { 
     return Ok(new ManyResponse()); 
    } 
} 

如果我刪除[FromUri],幫助頁面會顯示沒有錯誤。不知何故,如果我使用[FromUri],它認爲兩個端點是相同的。

是否有解決方法?

+0

我也收到類似的錯誤。 –

+0

@SimonBartlett:你可以查看我的回覆。 –

+0

只是fyi ...我用另一個解決方法更新了我的回覆。 –

回答

2

這確實是ApiExplorer中的一個錯誤。提起以下問題: https://aspnetwebstack.codeplex.com/workitem/1683

這裏的問題可以使用一個單獨的操作重新制定。在上面的場景中,我相信你在OneRequest中有一個Id屬性。

解決方法
重命名的路徑模板的屬性,使之具有不同的情況而在一個模型中的財產。因此,請在模板中將Id中的路由參數重命名爲id,這可以解決您的問題。

public class OneRequest 
{ 
    public int Id { get; set; } 
    .... 
} 

[Route("api/stuff/{id}")] 
public IHttpActionResult GetOne([FromUri] OneRequest request) 

事實上的Web API不應該做這些匹配的情況下,敏感的方式,這似乎是核心的bug,因爲它的您所看到的錯誤。

相關問題