![](/img/trans.png)
[英]ASP.NET throwing 404 for large file and 400 for extremely large files
[英]Asp.NET Web API throwing 404 instead of 400
我已经使用ASP.NET Web API模板在.NET 4.5和Entity Framework 6中构建了服务。 当我向服务发出GET请求并忽略必需的参数时,它将返回404(未找到)而不是400(错误请求)。 我尝试检查所需的参数是否为空,但是甚至没有到达方法中的代码(请参见下面的代码)。 我的问题是如何更改默认响应或使缺少必需参数的返回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?color=green&shape=square
。
服务器返回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 }
);
项目参数是强制性的,其余是可选的。 您可以只调用项目,也可以调用其余的,如果仅使用Optional之一,则抛出404,因为未定义路由。 这与使用装饰器相同,因此它不能完全解决您的问题,但可以更好地说明路由。 不过,我看不出您为什么特别需要BadRequest。
另一个编辑:
要使用帖子末尾提到的请求url参数,您只需要使用[FromUri]装饰器,请参阅此页面以获取更多详细信息,并且下面是一个breef示例:
// POST api/files/{project}?target={target}
public HttpResponseMessage Post(string project, string target, [FromUri]string fname){...}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.