Asp.NET Web API抛出404而不是400

本文关键字:抛出 NET Web API Asp | 更新日期: 2023-09-27 18:03:57

我使用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不访问物品/电子产品/tvs等信息,而更像是绿色和方形的物品,这些描述必须传入,因此查询类似于/item?color=green&shape=square

Asp.NET Web API抛出404而不是400

服务器返回404,因为它找不到您试图访问的路由。事实上,这些参数应该是你路线的一部分,无论是否为选项:Route("items/{reqParam1}/{reqParam2}")

如果您将它们定义为选项,那么如果您仅使用items并且可以抛出BadRequest,则仍应调用路由。如果不是optionals,那么NotFound可能仍然会被抛出。

您还应该发布webApi配置,这样我们就可以看到基本的路由映射。

编辑以以下路线为例:

config.Routes.MapHttpRoute(
            name: "RunsWithParams",
            routeTemplate: "api/{controller}/{project}/{skip}/{take}",
            defaults: new { take = RouteParameter.Optional, skip = RouteParameter.Optional }
        );

项目参数是必需的,其余参数是可选的。您可以只使用项目或剩余的项目进行调用,如果只使用其中一个Optionals,则会抛出404,因为未定义路由。这与使用decorator是一样的,所以它并不能完全解决您的问题,但可以更好地解释路由。不过,我不明白你为什么特别需要BadRequest。

另一个编辑:

要使用您在文章末尾提到的请求url参数,您只需要使用[FromUri]装饰器,有关更多详细信息,请参阅本页,下面是一个breef示例:

// POST api/files/{project}?target={target}
public HttpResponseMessage Post(string project, string target, [FromUri]string fname){...}