0

경로 선택 작동 방식에 관해 머리를 쓰는 데 문제가 있습니다. 서로 충돌하는 두 개의 라우트 속성 세트가 있습니다. 그들은웹 API 2 특성 라우팅 클래쉬

[Route("{apikey}/Parent/{parentID}/Children/ChildrenDataFormat")] 
[Route("{apikey}/Parent/{parentID}/{dataSelectionTypeA}/{dataSelectionTypeB}")] 

있습니까 첫 번째 경로의 마지막 두 부분은 하드 코딩 변경하지 않습니다. 두 번째 경로는 메서드 매개 변수에 바인딩됩니다.

두 번째 경로를 제거하면 첫 번째 경로는 정상적으로 작동하지만 그렇지 않은 경우 404가 표시됩니다. Route Matching에서 Guid 뒤에 "Parent"가 표시되고 "Children"및 "ChildrenDataFormat"이라는 사실을 무시하는 것으로 가정합니다. 대신에 3 가지를 따라 가야하므로 경로 2가 일치해야합니다.

이것이 올바른 가정이고이 문제를 해결할 수있는 확실한 수정 사항이 있습니까?

+0

당신이 순서를 지정 봤어있는 캡처입니다 보여주는 간단한 예입니다? 최악의 경우, 두 번째 경로의 토큰이 모두 두 번째 인 경우'dataSelectionTypeA = "Children"및'dataSelectionTypeB = "ChildrenDataFormat"을 사용하여 두 번째 경로에 도달하게되므로 404를 얻을 수있는 방법을 이해할 수 없습니다. 문자열로 정의됩니다. –

+0

예 저는 혼란 스럽습니다. 모든 변수는 Guid입니다. 나는 다른 컨트롤러와 동일한 컨트롤러에서 시도했지만 차이를 만드는 것처럼 보이지 않습니다. 두 경로 중 하나에서 ParentDifferent를 Parent로 변경하면 둘 다 작동합니다. – Oli

답변

-1

정확한 문제는 무엇인지 확실하지 않지만 모든 제약 조건에 경로 제약 조건을 추가하여 문제를 해결했습니다. 둘 다 패스 세그먼트 (segment)들은 모호성으로 이어지는 두 경기의 같은 번호를 가지고 있기 때문에 즉 내 노선들은 이제 경로는 속성 경로 둘 이후

[Route("{apikey:guid}/Parent/{parentID:guid}/Children/ChildrenDataFormat")] 
[Route("{apikey:guid}/Parent/{parentID:guid}/{dataSelectionTypeA:guid}/{dataSelectionTypeB:guid}")] 
+0

"이유는 모르겠지만 해결할 수있었습니다."... hmmm –

+0

이것은 답변이 아닙니다. 이 문제는 진술되지 않았다. 해결책은 설명되지 않습니다. 이것은 실수로 작업 한 해킹 일뿐입니다. –

+0

@MarkGreen 문제를 해결하는 방법에 대해 어떤 종류의 설명도하지 않아도되는 것보다 경로 제약 조건을 추가하여 문제를 해결할 수 있다는 점은 확실합니다. 가장 좋은 추측은 Route 's가 하드 코딩 된 문자열이나 변수 문자열을 구별하지 않는다는 것입니다. 알고있는 누군가가 그 말을하기 전까지는 .... 그런 것 같아요. – Oli

0

OLI

처럼, 그들은 암시하기 위해이 없다 보인다.

해결 방법은 경로 일치 중 하나에 만 제약 조건을 추가하는 것이 었습니다. 다른 해결 방법은 순서를 먼저 사용하여보다 구체적인 경로 (/ Children/ChildrenDataFormat로 끝나는 경로)를 사용하는 것입니다. 여기

는 순서와 방법 경로 값이

public class ValuesController : ApiController 
{ 
    [Route("api/values/MyName", Order = 1)] 
    [Route("api/values/{name}", Order = 2)] 
    public string Get() 
    { 
     object nameObj; 
     Request.GetRouteData().Values.TryGetValue("name", out nameObj); 

     if (nameObj != null) 
     { 
      // came from second route 
      return "Route is {name} and name was: " + (string) nameObj; 
     } 
     else 
     { 
      return "Route is MyName so no name value is available"; 
     } 
    } 
}