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

问题描述 投票:0回答:1

我使用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不访问项目/电子/电视等信息,但更像是项目为绿色且为正方形的项目,其中必须传递这些描述 - 因此查询类似于/item?color=green&shape=square

c# asp.net entity-framework asp.net-web-api http-error
1个回答
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。

又一个编辑:

要在帖子末尾提及使用请求url参数,您只需要使用[FromUri]装饰器,有关详细信息,请参阅this page,以及后面的breef示例:

// POST api/files/{project}?target={target}
public HttpResponseMessage Post(string project, string target, [FromUri]string fname){...}
© www.soinside.com 2019 - 2024. All rights reserved.