繁体   English   中英

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请求并忽略必需的参数时,它将返回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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM