我一直在构建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 Controller方法的格式如下:

第一个是工作的:

[ActionName("postdb")]
public IEnumerable<string[]> postDB(string id)
{ ...


第二个没有:

[ActionName("getquery")]
public IEnumerable<string[]> getQuery(string tables)
{ ...


我以相同的方式从角度调用它们(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,HttpOptions,HttpPatch,HttpPost或HttpPut。
  否则,如果控制器方法的名称以“ Get”,“ Post”,“ Put”,“ Delete”,“ Head”,“ Options”或“ Patch”开头,则按照惯例,该操作支持该HTTP方法。
  如果以上都不满足,则该方法支持POST。
  


因此,在您的示例中,postdb方法可能映射到POST方法。但是可能是因为它是小写字母,所以ASP.NET不喜欢这种情况,因此应用了规则3-如果您确实要使用ActionName("PostDB")(出于某种原因)而不是[ActionName("GetQuery")],请尝试使用ActionNameRoute

关于c# - WebAPI ActionName路由工作一半,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39563099/

10-10 09:16