2013-05-30 1 views
2

Ok web api routing fun.웹 API 라우팅 - 컨트롤러에서 요청과 일치하는 작업을 찾을 수 없습니다.

내 웹 API 경로 구성은 다음과 같습니다. 지오 코딩 및 정보 경로 실적이 우수합니다. 검색 결과가 스위트를 따르지 않는 이유가 혼란 스럽습니다.

/* 
    ==Geocoding Endpoints== 
*/ 

config.Routes.MapHttpRoute(
    name: "v1_GeocodeApi", 
    routeTemplate: "api/v{version}/{controller}/{street}/{zone}", 
    defaults: new 
    { 
     action = "get", 
     controller = "Geocode", 
     version = "1" 
    }); 

config.Routes.MapHttpRoute(
    name: "v1_GeocodeMultipleApi", 
    routeTemplate: "api/v{version}/{controller}/multiple", 
    defaults: new 
    { 
     action = "multiple", 
     controller = "Geocode", 
     version = "1" 
    }); 

/* 
    ==Search Endpoints== 
*/ 

config.Routes.MapHttpRoute(
    name: "v1_SearchApi", 
    routeTemplate: "api/v{version}/{controller}/{featureClass}/{returnValues}", 
    defaults: new 
    { 
     action = "Get", 
     controller = "Search", 
     version = "1" 
    }); 

/* 
    ==Info Endpoints== 
*/ 

config.Routes.MapHttpRoute(
    name: "v1_InfoApi", 
    routeTemplate: "api/v{version}/{controller}/FeatureClassNames", 
    defaults: new 
    { 
     action = "FeatureClassNames", 
     controller = "Info", 
     version = "1" 
    }); 
} 

그래서 http://webapi/api/v1/search/fc/rv과 같은 URL을 갖고 싶습니다. 이 URL은 아래의 스택 추적을 생성하고 404 결과를 얻습니다. 컨벤션은 get 메소드가있는 컨트롤러가 있으면 기본적으로 사용됩니다. 첫 번째 지오 코딩 경로에서 발생하는 것으로 보입니다. 나는/다중 경로 템플릿을 api/v{version}/{controller}/**for**/{featureClass}/{returnValues} 라우팅 작품을 만들기로 두 번째 지오 코딩이 항공사는 또 다른 경로가 더 유사하게되었고 경우

w3wp.exe Information: 0 : Request, Method=GET, 
Url=http://webapi/api/v1/Search/fc/rv, 
Message='http://webapi/api/v1/Search/fc/rv' 
w3wp.exe Information: 0 : Message='Search', 
Operation=RouteVersionedControllerSelector.SelectController w3wp.exe 
Information: 0 : 
Message='WebAPI.API.Controllers.API.Version1.SearchController', 
Operation=DefaultHttpControllerActivator.Create w3wp.exe Information: 
0 : Message='WebAPI.API.Controllers.API.Version1.SearchController', 
Operation=HttpControllerDescriptor.CreateController w3wp.exe 
Information: 0 : Message='Will use same 'JsonpMediaTypeFormatter' 
formatter', 
Operation=JsonpMediaTypeFormatter.GetPerRequestFormatterInstance 
w3wp.exe Information: 0 : Message='Selected 
formatter='JsonpMediaTypeFormatter', content-type='application/json; 
charset=utf-8'', Operation=DefaultContentNegotiator.Negotiate w3wp.exe 
Warning: 0 : Message='UserMessage='No HTTP resource was found that 
matches the request URI 
'http://webapi/api/v1/Search/fc/rv'.', 
MessageDetail='No action was found on the controller 'Search' that 
matches the request.'', 
Operation=ApiControllerActionSelector.SelectAction, Status=404 
(NotFound), Exception=System.Web.Http.HttpResponseException: 
Processing of the HTTP request resulted in an exception. Please see 
the HTTP response returned by the 'Response' property of this 
exception for details. at 
System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext 
controllerContext) at 
System.Web.Http.Tracing.Tracers.HttpActionSelectorTracer.<>c__DisplayClass2.<System.Web.Http.Controllers.IHttpActionSelector.SelectAction>b__0() at 
System.Web.Http.Tracing.ITraceWriterExtensions.TraceBeginEnd(ITraceWriter 
traceWriter, HttpRequestMessage request, String category, TraceLevel 
level, String operatorName, String operationName, Action`1 beginTrace, 
Action execute, Action`1 endTrace, Action`1 errorTrace) w3wp.exe 
Warning: 0 : Message='UserMessage='No HTTP resource was found that 
matches the request URI 
'http://webapi/api/v1/Search/fc/rv'.', 
MessageDetail='No action was found on the controller 'Search' that 
matches the request.'', Operation=SearchController.ExecuteAsync, 
Status=404 (NotFound), 
Exception=System.Web.Http.HttpResponseException: Processing of the 
HTTP request resulted in an exception. Please see the HTTP response 
returned by the 'Response' property of this exception for details. 
at 
System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext 
controllerContext) at 
System.Web.Http.Tracing.Tracers.HttpActionSelectorTracer.<>c__DisplayClass2.<System.Web.Http.Controllers.IHttpActionSelector.SelectAction>b__0() at 
System.Web.Http.Tracing.ITraceWriterExtensions.TraceBeginEnd(ITraceWriter 
traceWriter, HttpRequestMessage request, String category, TraceLevel 
level, String operatorName, String operationName, Action`1 beginTrace, 
Action execute, Action`1 endTrace, Action`1 errorTrace) at 
System.Web.Http.Tracing.Tracers.HttpActionSelectorTracer.System.Web.Http.Controllers.IHttpActionSelector.SelectAction(HttpControllerContext 
controllerContext) at 
System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext 
controllerContext, CancellationToken cancellationToken) at 
System.Web.Http.Tracing.Tracers.HttpControllerTracer.<>c__DisplayClass4.<System.Web.Http.Controllers.IHttpController.ExecuteAsync>b__0() 
at 
System.Web.Http.Tracing.ITraceWriterExtensions.TraceBeginEndAsync[TResult](ITraceWriter 
traceWriter, HttpRequestMessage request, String category, TraceLevel 
level, String operatorName, String operationName, Action`1 beginTrace, 
Func`1 execute, Action`2 endTrace, Action`1 errorTrace) w3wp.exe 
Information: 0 : Response, Status=404 (NotFound), Method=GET, 
Url=http://webapi/api/v1/Search/fc/rv, 
Message='Content-type='application/json; charset=utf-8', 
content-length=unknown' 

지금 모두가 행복하다.

컨트롤러 서명

public class SearchController : ApiController 
{ 
    [HttpGet] 
    public async Task<HttpResponseMessage> Get(string featureClass, string returnValues, [FromUri] SearchOptions options) 
    { 
     // ... 
    } 
} 

내 직감은 비동기 작업 부분은 바인딩 얻을 기본으로 어떻게 든 그것을 떨어져 던지고 있지만 수정 된 경로와 함께 작동하기 때문에 그 이해가되지 않는다는 점이다.

답변

1

귀하의 요청 URL은 http://webapi/api/v1/search/fc/rv이며 'stree'및 'zone'변수가있는 v1_GeocodeApi 경로와 일치합니다. 이 변수 이름은 Search 컨트롤러의 Get 메소드의 매개 변수 이름과 일치하지 않으므로 404가 표시됩니다. 컨트롤러 이름을 변수로 허용하지 않고 경로를 수정 해보십시오. , api/v{version}/Search/{featureClass}/{returnValues}

+0

등이 있습니다. 스택 추적에서 WebAPI.API.Controllerers.API.Version1.SearchController를 선택했기 때문에 올바르지 않습니다. {conroller}를 제거하기 위해 경로를 수정하면 문제가 해결됩니다. – Steve

+0

나는 귀하의 의견에 의해 약간 불명확합니다 ... 여기에 맞지 않습니까? –

+0

나는 편집하기 전에 그것을 썼다. 스택 추적 텍스트 때문에 v1_geocodeapi 경로가 선택되지 않았다고 생각합니다. 하지만 매개 변수 이름이 일치하지 않으면 404가 일반적으로 발생하기 때문에 지금은 의미가 있습니다. 그것은 정확하게 일어난 일입니다. 추적에서 선택한 경로가 표시되기를 바랍니다. 나는 그것을하기위한 다른 프로젝트가 있다고 생각한다. – Steve