确定web 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产生下面的堆栈跟踪并产生404.我认为惯例是如果你有一个带有get方法的控制器,它将默认使用。这似乎是第一个地理编码路线所发生的情况。
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'
现在,如果我要制作另一条路线更类似于第二条地理编码路线,并且/ multiple制作路线模板api/v{version}/{controller}/**for**/{featureClass}/{returnValues}
,则路由工作正常,所有人都很高兴。
控制器签名是
public class SearchController : ApiController
{
[HttpGet]
public async Task<HttpResponseMessage> Get(string featureClass, string returnValues, [FromUri] SearchOptions options)
{
// ...
}
}
我的预感是异步任务部分使用默认的get绑定以某种方式抛弃它,但这没有意义,因为它适用于修改后的路由。
答案 0 :(得分:1)
您的请求网址http://webapi/api/v1/search/fc/rv
与具有'stree'和'zone'变量的v1_GeocodeApi
路由匹配。由于这些变量名称与搜索控制器的Get方法的参数名称不匹配,因此您可以看到404.您可以尝试修改路由,使其不接受控制器名称作为变量,但有api/v{version}/Geocode/{street}/{zone}
,api/v{version}/Search/{featureClass}/{returnValues}
之类的内容。