WebApi returns Http错误500,可能是路由问题

WebApi returns Http error 500, probably a routing issue

我有以下网站Apiclass:

public class BizAuthController : ApiController
{
    [HttpPost]
    public __BizAuthModel Register([FromBody] __BizAuthModel authInfo)
    {
        if (ModelState.IsValid)
        {
          //... do whatever
        }
        throw new HttpResponseException(HttpStatusCode.BadRequest);
    }

    [HttpPost]
    public __BizAuthModel Login([FromBody] __BizAuthModel authInfo)
    {
        if (ModelState.IsValid)
        {
          //... do whatever
        }
        throw new HttpResponseException(HttpStatusCode.Forbidden);
    }

}

这是我的网站Api配置(标准,我没碰):

public static class WebApiConfig
{
    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 }
        );
    }
}

现在,如果我删除 "Login" 方法,则可以调用 "Register" 并正常工作。如果我保留 "Login" 方法然后调用 "Register" returns Http 错误 500。 为什么?我该如何解决这个问题?

框架不知道要在 POST 上使用哪个操作。这两个操作匹配默认 routeTemplate

将基于约定的路由更新为 api/{controller}/{action}/{id} 并按名称而不是仅按 HttpMethod 调用操作。即:POST api/BizAuth/RegisterPOST api/BizAuth/Login

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

        // Web API routes
        config.MapHttpAttributeRoutes();

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

    }
}

In ASP.NET Web API 2 您也可以尝试直接添加 [Route] 过滤器api 的 Register 操作方法,以区别于 Login,应该是默认的 get 操作,并保留 WebApiConfig.Register 路由配置方法:

public class BizAuthController : ApiController
{
    [HttpPost]
    [Route("Register")]
    public __BizAuthModel Register([FromBody] __BizAuthModel authInfo)
    {
        if (ModelState.IsValid)
        {
          //... do whatever
        }
        throw new HttpResponseException(HttpStatusCode.BadRequest);
    }

    [HttpPost]
    public __BizAuthModel Login([FromBody] __BizAuthModel authInfo)
    {
        if (ModelState.IsValid)
        {
          //... do whatever
        }
        throw new HttpResponseException(HttpStatusCode.Forbidden);
    }
}