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/Register
和 POST 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);
}
}
我有以下网站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/Register
和 POST 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);
}
}