Asp.NET Web API 抛出 404 而不是 400
Asp.NET Web API throwing 404 instead of 400
我使用 ASP.NET Web API 模板在 .NET 4.5 和 Entity Framework 6 中构建了一个服务。当我向服务发出 GET 请求并省略所需参数时,它 returning 404 - Not Found,而不是 400 - Bad Request。我尝试检查所需参数是否为空,但它甚至没有到达方法内部的代码(请参见下面的代码)。我的问题是如何更改默认响应或将其设置为 return 400(因为缺少必需参数)。
[Route("item")]
[HttpGet]
public IHttpActionResult GetItem(string reqParam1, string reqParam2)
{
if (reqParam1 == null || reqParam2 == null)
throw new HttpResponseException(HttpStatusCode.BadRequest);
//remainder of code here
}
这是 webAPI.config 文件。我认为我没有从默认修改它。
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 }
);
}
}
请注意:API 不是在访问 item/electronics/tvs 之类的信息,而是更像是项目为绿色且为正方形的项目,这些描述是必须传入的 - 所以查询类似于 /item?color=green&shape=square
.
服务器 returns 404,因为它找不到您尝试访问的路由。实际上参数应该是你的路线的一部分,作为可选或不:Route("items/{reqParam1}/{reqParam2}")
如果您将它们定义为可选项,那么如果您仅使用 items
路由仍应被调用,并且您可以抛出 BadRequest。如果不是可选值,那么 NotFound 可能仍会被抛出。
您还应该 post webApi 配置,以便我们可以看到基本路由映射。
编辑
以下面的路线为例:
config.Routes.MapHttpRoute(
name: "RunsWithParams",
routeTemplate: "api/{controller}/{project}/{skip}/{take}",
defaults: new { take = RouteParameter.Optional, skip = RouteParameter.Optional }
);
项目参数是必须的,其余的是可选的。您可以仅使用项目或其余项目进行调用,如果您仅使用其中一个 Optional,则会抛出 404,因为未定义路由。
这与使用装饰器相同,因此它并不能完全解决您的问题,但可以更好地解释路由。不过,我不明白为什么您特别需要 BadRequest。
又一次编辑:
要使用您在 post 末尾提到的请求 url 参数,您只需要使用 [FromUri] 装饰器,有关详细信息,请参阅 this page,下面是一个简单的例子:
// POST api/files/{project}?target={target}
public HttpResponseMessage Post(string project, string target, [FromUri]string fname){...}
我使用 ASP.NET Web API 模板在 .NET 4.5 和 Entity Framework 6 中构建了一个服务。当我向服务发出 GET 请求并省略所需参数时,它 returning 404 - Not Found,而不是 400 - Bad Request。我尝试检查所需参数是否为空,但它甚至没有到达方法内部的代码(请参见下面的代码)。我的问题是如何更改默认响应或将其设置为 return 400(因为缺少必需参数)。
[Route("item")]
[HttpGet]
public IHttpActionResult GetItem(string reqParam1, string reqParam2)
{
if (reqParam1 == null || reqParam2 == null)
throw new HttpResponseException(HttpStatusCode.BadRequest);
//remainder of code here
}
这是 webAPI.config 文件。我认为我没有从默认修改它。
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 }
);
}
}
请注意:API 不是在访问 item/electronics/tvs 之类的信息,而是更像是项目为绿色且为正方形的项目,这些描述是必须传入的 - 所以查询类似于 /item?color=green&shape=square
.
服务器 returns 404,因为它找不到您尝试访问的路由。实际上参数应该是你的路线的一部分,作为可选或不:Route("items/{reqParam1}/{reqParam2}")
如果您将它们定义为可选项,那么如果您仅使用 items
路由仍应被调用,并且您可以抛出 BadRequest。如果不是可选值,那么 NotFound 可能仍会被抛出。
您还应该 post webApi 配置,以便我们可以看到基本路由映射。
编辑 以下面的路线为例:
config.Routes.MapHttpRoute(
name: "RunsWithParams",
routeTemplate: "api/{controller}/{project}/{skip}/{take}",
defaults: new { take = RouteParameter.Optional, skip = RouteParameter.Optional }
);
项目参数是必须的,其余的是可选的。您可以仅使用项目或其余项目进行调用,如果您仅使用其中一个 Optional,则会抛出 404,因为未定义路由。 这与使用装饰器相同,因此它并不能完全解决您的问题,但可以更好地解释路由。不过,我不明白为什么您特别需要 BadRequest。
又一次编辑:
要使用您在 post 末尾提到的请求 url 参数,您只需要使用 [FromUri] 装饰器,有关详细信息,请参阅 this page,下面是一个简单的例子:
// POST api/files/{project}?target={target}
public HttpResponseMessage Post(string project, string target, [FromUri]string fname){...}