WebAPI ActionName路由工作一半
本文关键字:一半 工作 路由 ActionName WebAPI | 更新日期: 2023-09-27 18:07:35
我一直在构建一个WebAPI,试图路由到正确的方法与ActionName。它与我尝试调用的一个方法一起工作,但另一个方法得到404错误。
WebAPI配置文件:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
我的WebAPI控制器方法的格式如下:
第一个是工作的:
[ActionName("postdb")]
public IEnumerable<string[]> postDB(string id)
{ ...
第二行不行:
[ActionName("getquery")]
public IEnumerable<string[]> getQuery(string tables)
{ ...
我从angular中以相同的方式调用它们(Temp是一个作为参数传递的字符串):
$http.post('api/Test/postdb/' + temp).then(function (response) { ...
和
$http.get('api/Test/getquery/' + temp).then(function (response) { ...
我试过改变两个动作的名字,第一个不管名字是什么,第二个不管名字是什么都不工作。我还尝试了重新排序,在GET和POST之间进行更改,以及更改参数。
有什么建议吗?
不确定为什么要使用ActionName
来设置路由?
您可能应该查看Route
属性。如:
[HttpPost]
[Route("postdb")]
// Action doesn't have to be called 'postdb'
public IEnumerable<string[]> postDB(string id)
ActionName
通常用于不同的目的(purpose of ActionName)
然而,我认为在你的例子中发生了一些奇怪的事情-我认为设置ActionName
不应该影响那里的路由。为了调试,我建议设置失败请求跟踪,以查看请求在哪个点未能到达操作。
这些是WebAPI中动作选择的基本规则(http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection)
因此,在您的示例中,
你可以用一个属性来指定HTTP方法:AcceptVerbs, HttpDelete, HttpGet, HttpHead, httppoptions, httpppatch, HttpPost,或HttpPut。
否则,如果控制器方法名以"Get"、"Post"、"Put"、"Delete"、"Head"、"Options"或"Patch"开头,则按照约定该操作支持该HTTP方法。
如果以上都不是,则该方法支持POST。
postdb
方法可以映射到POST方法。但是可能是,因为它是小写的ASP。. NET不喜欢这样,并应用了规则3 -如果你真的想使用ActionName
(无论出于什么原因)而不是Route
,请尝试使用ActionName("PostDB")
和[ActionName("GetQuery")]
。
第二个动作中参数tables
的名称
[ActionName("getquery")]
public IEnumerable<string[]> getQuery(string tables)
{ ...
与路由中参数id
的名称不匹配:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }