我使用ASP.NET Web API模板在.NET 4.5和Entity Framework 6中构建了一个服务。当我向服务发出GET请求并省略所需参数时,它返回404 - Not Found,而不是400 - Bad Request。我试着检查所需的参数是否为null,但它甚至没有达到方法内的代码(参见下面的代码)。我的问题是如何更改默认响应或使其返回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不会访问项目/电子/电视等信息,但更像是项目为绿色且为方形的项目,其中必须传递这些描述 - 因此查询类似于{{1 }}
答案 0 :(得分:1)
服务器返回404,因为它无法找到您尝试访问的路由。实际上,参数应该是您的路线的一部分,作为选项或不是:Route("items/{reqParam1}/{reqParam2}")
如果您将它们定义为选项,那么如果仅使用items
,则仍应调用该路径,并且您可以抛出BadRequest。如果不是期权,那么可能仍然会抛出NotFound。
您还应发布webApi配置,以便我们可以看到基本路线映射。
修改强> 采取以下路线示例:
config.Routes.MapHttpRoute(
name: "RunsWithParams",
routeTemplate: "api/{controller}/{project}/{skip}/{take}",
defaults: new { take = RouteParameter.Optional, skip = RouteParameter.Optional }
);
项目参数是必需的,其余是可选的。您可以只使用项目或剩余项目进行调用,如果仅使用其中一个Optionals,则抛出404,因为路径未定义。 这与使用装饰器相同,因此它并不能完全解决您的问题,但会更好地解释路由。尽管如此,我还是不明白你为什么特别需要BadRequest。
另一个编辑:
要使用帖子末尾提及的请求网址参数,您只需要使用[FromUri]装饰器,有关详细信息,请参阅this page,以下是一个breef示例:
// POST api/files/{project}?target={target}
public HttpResponseMessage Post(string project, string target, [FromUri]string fname){...}