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之间进行更改,以及更改参数。

有什么建议吗?

WebAPI ActionName路由工作一半

不确定为什么要使用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)

  1. 你可以用一个属性来指定HTTP方法:AcceptVerbs, HttpDelete, HttpGet, HttpHead, httppoptions, httpppatch, HttpPost,或HttpPut。

  2. 否则,如果控制器方法名以"Get"、"Post"、"Put"、"Delete"、"Head"、"Options"或"Patch&quot开头,则按照约定该操作支持该HTTP方法。

  3. 如果以上都不是,则该方法支持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 }