web-dev-qa-db-ja.com

Web API 2エンドポイントからカスタムHTTPステータスコードを返す

私はWebAPI 2のサービスに取り組んでおり、エンドポイントは現在IHttpActionResultを返します。ステータスコード_422_を返したいのですが、それはHttpStatusCode列挙型ではないので、すべてのコンストラクタにはHttpStatusCodeのパラメーター

現状では、BadResult(message)を返していますが、_422_ +メッセージを返す方がよりわかりやすく、クライアントにとって便利です。何か案は?

44
Garrison Neely

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")
                )
            );
        }
    }
}
77
lilo.jacob
 return Content((HttpStatusCode) 422, whatEver);

クレジットは: OK以外の応答に対してIHttpActionResultでコンテンツを返す

コードは999以下でなければなりません

100〜200のコードは無視してください。

22
peyman

この方法はシンプルでエレガントです。

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

次にangular controller。

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

お役に立てば幸いです。

3

このために、Action Filter Attributeを使用する必要がある場合があります。派手なものは何もありません。クラスを作成し、c#のActionFilterAttributeクラスから継承するだけです。次に、OnActionExecutingという名前のメソッドをオーバーライドして、これを実装します。次に、コントローラーのヘッドでこのフィルターを使用します。以下はデモです。

ActionFilterAttributeでカスタムステータスコードベースのメッセージを生成する必要がある場合、次の方法で記述できます。

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

お役に立てれば。

0
Sajeeb Chandan

別の簡単な例:

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);
0
themefield