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

时间:2017-01-02 14:19:58

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

我有以下Web Api类:

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);
    }

}

这是我的WebApiConfig(标准,我没碰到它):

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 }
        );
    }
}

现在,如果我删除“登录”方法,可以调用“注册”并正常工作。如果我保持“登录”方法然后调用“注册”返回Http错误500。 为什么?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

框架不知道在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 }
        );

    }
}

答案 1 :(得分:0)

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);
    }
}
相关问题