簡體   English   中英

從WebAPI 2端點返回自定義HTTP狀態代碼

[英]Return Custom HTTP Status Code from WebAPI 2 endpoint

我正在使用WebAPI 2中的服務,並且端點當前返回IHttpActionResult 我想返回狀態碼422 ,但是由於它不在HttpStatusCode枚舉中,所以我對如何發送該方法感到困惑,因為所有構造函數都需要HttpStatusCode的參數

就目前情況而言,我返回的是BadResult(message) ,但是返回422 +的消息對我的客戶來說更具描述性和實用性。 有任何想法嗎?

根據C#規范:

枚舉類型可以采用的值集不受其枚舉成員的限制。 特別是,枚舉的基礎類型的任何值都可以轉換為枚舉類型,並且是該枚舉類型的不同有效值

因此,您可以將狀態代碼422強制轉換為HttpStatusCode。

控制器示例:

using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace CompanyName.Controllers.Api
{
    [RoutePrefix("services/noop")]
    [AllowAnonymous]
    public class NoOpController : ApiController
    {
        [Route]
        [HttpGet]
        public IHttpActionResult GetNoop()
        {
            return new System.Web.Http.Results.ResponseMessageResult(
                Request.CreateErrorResponse(
                    (HttpStatusCode)422,
                    new HttpError("Something goes wrong")
                )
            );
        }
    }
}
 return Content((HttpStatusCode) 422, whatEver);

功勞是: 對於非OK響應,返回帶有IHttpActionResult的內容

並且您的代碼必須為<= 999

請忽略100到200之間的代碼。

我用這種方式簡單而優雅。

public ActionResult Validate(User user)
{
     return new HttpStatusCodeResult((HttpStatusCode)500, 
               "My custom internal server error.");
}

然后是角度控制器。

function errorCallBack(response) {            
$scope.response = {
   code: response.status,
   text: response.statusText
}});    

希望對您有幫助。

為此,您可能需要使用動作過濾器屬性 沒有什么花哨。 只需創建一個類並從c#中的ActionFilterAttribute類繼承即可。 然后重寫一個名為OnActionExecuting的方法以實現此目的。 然后,只需在任何控制器的頭上使用此過濾器即可。 以下是一個演示。

在需要在ActionFilterAttribute生成基於自定義狀態代碼的消息的情況下,可以通過以下方式編寫:

        if (necessity_to_send_custom_code)
        {
            actionContext.Response = actionContext.Request.CreateResponse((HttpStatusCode)855, "This is custom error message for you");
        }

希望這可以幫助。

另一個簡化的示例:

public class MyController : ApiController
{
    public IHttpActionResult Get()
    {
        HttpStatusCode codeNotDefined = (HttpStatusCode)422;
        return Content(codeNotDefined, "message to be sent in response body");
    }
}

Content是在抽象類ApiController (控制器的基礎)中定義的虛擬方法。 參見以下聲明:

protected internal virtual NegotiatedContentResult<T> Content<T>(HttpStatusCode statusCode, T value);

我在控制器中使用了一個自定義過濾器,該過濾器會捕獲所有異常並返回自定義錯誤結果,因此我需要一種基於異常消息返回自定義消息響應的方法。

我正在使用JsonResult (位於Microsoft.AspNetCore.Mvc命名空間中)返回自定義狀態代碼和消息,例如:

public class DomainViolationFilter : ExceptionFilterAttribute
    {
        public override void OnException(ExceptionContext context)
        {
            switch (context.Exception)
            {
                case EntityNotFoundException e:
                    JsonResult toReturn = new JsonResult(e);
                    toReturn.StatusCode = 404;
                    context.Result = toReturn;
                    return;
            }
        }
    }

就我而言,為簡單起見,我直接對異常對象(ex)進行了序列化,但是您應該只返回相關(和安全)的數據,或用例中需要的任何數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM