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){...}