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)
{
// ...
}
}
내 직감은 비동기 작업 부분은 바인딩 얻을 기본으로 어떻게 든 그것을 떨어져 던지고 있지만 수정 된 경로와 함께 작동하기 때문에 그 이해가되지 않는다는 점이다.
등이 있습니다. 스택 추적에서 WebAPI.API.Controllerers.API.Version1.SearchController를 선택했기 때문에 올바르지 않습니다. {conroller}를 제거하기 위해 경로를 수정하면 문제가 해결됩니다. – Steve
나는 귀하의 의견에 의해 약간 불명확합니다 ... 여기에 맞지 않습니까? –
나는 편집하기 전에 그것을 썼다. 스택 추적 텍스트 때문에 v1_geocodeapi 경로가 선택되지 않았다고 생각합니다. 하지만 매개 변수 이름이 일치하지 않으면 404가 일반적으로 발생하기 때문에 지금은 의미가 있습니다. 그것은 정확하게 일어난 일입니다. 추적에서 선택한 경로가 표시되기를 바랍니다. 나는 그것을하기위한 다른 프로젝트가 있다고 생각한다. – Steve