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

时间:2015-07-22 14:44:08

标签: c# asp.net entity-framework asp.net-web-api http-error

我使用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 }}

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