簡體   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