找不到ASP.NET Web API路由控制器

时间:2016-03-24 20:39:53

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

我正在尝试发布到以下Web API:

http://localhost:8543/api/login/authenticate

LoginApi(Web API)定义如下:

[RoutePrefix("login")]
public class LoginApi : ApiController
{
    [HttpPost]
    [Route("authenticate")]
    public string Authenticate(LoginViewModel loginViewModel)
    {  
        return "Hello World"; 
    }
}

WebApiConfig.cs:

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

这是我得到的错误:

Request URL:http://localhost:8543/api/login/authenticate
Request Method:POST
Status Code:404 Not Found
Remote Address:[::1]:8543

3 个答案:

答案 0 :(得分:9)

您的控制器名称“LoginApi”需要以“Controller”结尾,以便框架找到它。例如:“LoginController”

这篇文章解释了ASP.NET Web API中的路由:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

答案 1 :(得分:3)

您在控制器上使用login作为路由前缀,因此尝试调用

http://localhost:8543/api/login/authenticate

将无法找到此代码

[RoutePrefix("login")]
public class LoginApi : ApiController
{
    //eg:POST login/authenticate.
    [HttpPost]
    [Route("authenticate")]
    public string Authenticate(LoginViewModel loginViewModel)
    {  
        return "Hello World"; 
    }
}

仅适用于

http://localhost:8543/login/authenticate

您需要将路线前缀更改为

[RoutePrefix("api/login")]
public class LoginApi : ApiController
{
    //eg:POST api/login/authenticate.
    [HttpPost]
    [Route("authenticate")]
    public string Authenticate(LoginViewModel loginViewModel)
    {  
        return "Hello World"; 
    }
}

答案 2 :(得分:0)

请注意,您正在使用config.Routes.MapHttpRoute在控制器/操作和约定路由上使用属性路由。

config.Routes.MapHttpRoute将根据您的定义“api/{controller}/{id}”映射路线。

属性路由时,会根据您定义路线的方式映射路线:/login/authenticate

此外,由于您同时使用属性路由和约定路由,因此属性路由需要占用优先级。我会坚持使用其中一个。两者都会增加一些关于将使用什么路由来访问动作方法的混淆。