【问题标题】:WebApi returns Http error 500, probably a routing issueWebApi 返回 Http 错误 500,可能是路由问题
【发布时间】:2017-01-02 14:19:57
【问题描述】:

我有以下 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。 为什么?我该如何解决这个问题?

【问题讨论】:

  • 框架不知道在 POST 上使用哪个操作。这两个动作匹配默认的routeTemplate。您打算如何调用该操作?您可能需要更新到 api/{controller}/{action}/{id} 的基于约定的路由并按名称而不是仅通过 HttpMethod 调用操作。即:POST api/BizAuth/RegisterPOST api/BizAuth/Login

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


【解决方案1】:

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

    }
}

【讨论】:

  • 要么我不懂 REST,要么我不懂 Web API。 Web API 的想法是每个控制器都将仅由一个 POST 操作和一个 GET 操作等组成吗?或者 REST 是否建议这样做?我真的不知道。但是,我总是用动作名称调用,我认为 Web API 的默认路由机制与常规 Web 控制器的工作方式相同。无论如何,我按照这里的建议对其进行了更改,它符合我的需要。谢谢。
【解决方案2】:

ASP.NET Web API 2 中,您也可以尝试将 [Route] 过滤器直接添加到 api 的 Register 操作方法中,以将其与 @ 区分开来987654323@,应该是默认的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);
    }
}

【讨论】:

    猜你喜欢
    • 2017-11-13
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2015-12-26
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多