2014-01-22 3 views
1

웹 API 도움말 페이지를 버전 2.1로 업그레이드했습니다. 나는이 두 컨트롤러의 행동에 문제를 추적 한웹 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

여기에 나온 문제는 단일 조치를 사용하여 다시 작성 될 수 있습니다. 위 시나리오에서 Id 속성이 OneRequest에 있다고 생각합니다.

해결 : 그것은 다른 경우 아니라 모델의 속성에 하나를 가질 수 있도록
이 경로 템플릿의 속성을 변경합니다. 따라서 여기서 경로 매개 변수의 이름을 Id에서 id으로 바꾸면 문제가 해결됩니다.

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

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

실제로 웹 API는 이러한 유형의 대소 문자를 구분하는 방법으로 사용하면 안되며, 오류가 발생하여 핵심 버그 인 것으로 보입니다.