WebAPI ActionName路由一半工作

时间:2016-09-18 22:03:46

标签: c# angularjs asp.net-mvc-4 asp.net-web-api

我一直在构建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之间进行更改,以及更改参数。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

不确定您使用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,HttpOptions,HttpPatch,HttpPost或HttpPut。

  2.   
  3. 否则,如果控制器方法的名称以“Get”,“Post”,“Put”,“Delete”,“Head”,“Options”或“Patch”开头,那么按惯例action支持HTTP方法。

  4.   
  5. 如果不是上述方法,则该方法支持POST。

  6.   

因此,在您的示例中,postdb方法可能映射到POST方法。但可能是,因为它是小写的ASP.NET不喜欢它并应用了规则3 - 如果你真的想使用{{1,请尝试使用ActionName("PostDB")[ActionName("GetQuery")] (无论出于何种原因)而不是ActionName

答案 1 :(得分:0)

第二个操作中参数var dogs = lst.OfType<Dog>().ToList() var cats = lst.OfType<Cat>().ToList() var parrots = lst.OfType<Parrot>().ToList() 的名称

tables

与路径中参数[ActionName("getquery")] public IEnumerable<string[]> getQuery(string tables) { ... 的名称不匹配:

id