web-dev-qa-db-ja.com

Asp.net Web API-actionfilterからデータを返す

Wep api actionfilterからjsonオブジェクトを返したいのですが。どうすればこれを達成できますか?

アクションからオブジェクトを返すことはできますが、何らかの条件でactionfilterからデータを返す必要があります。

前もって感謝します。


編集:1次のようにコードを変更すると、ブラウザーはまだ応答なしでロードされ、タイムアウトエラーで終了します。

  public class ValidationActionFilter : ActionFilterAttribute
{

    public override void OnActionExecuting(HttpActionContext actionContext)
    {


        var modelState = actionContext.ModelState;
        if (!modelState.IsValid)
        {
            List<string> arr = new List<string>();
            foreach (var key in modelState.Keys)
            {
                var state = modelState[key];
                if (state.Errors.Any())
                {
                    string er = state.Errors.First().ErrorMessage;
                    if (!string.IsNullOrEmpty(er))
                    {
                        arr.Add(er);
                    }
                }
            }               

           var output =  new Result() { Status = Status.Error.ToString(), Data = null, Message = arr };
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, output, actionContext.ControllerContext.Configuration.Formatters.JsonFormatter);
        }     


    }
}
16
Kumaresan Lc

必要なのは、応答を割り当てることだけです。

public class MyActionFilterAttribute: ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        actionContext.Response = actionContext.Request.CreateResponse(
            HttpStatusCode.OK, 
            new { foo = "bar" }, 
            actionContext.ControllerContext.Configuration.Formatters.JsonFormatter
        );
    }
}

次のコントローラーアクションを想定します。

[MyActionFilter]
public string Get()
{
    return "OK";
}

このカスタムアクションフィルターは、アクションの実行を短絡し、提供した応答を直接返します。

36
Darin Dimitrov

私のように誰かがここに来て、彼らの問題に対する答えを見つけられない場合に備えて、これを捨てるだけです。

間違ったインポートを使用している可能性があります-2つのオプションがあります。

  • System.Web.Http.Filters
  • System.Web.Mvc(またはSystem.Web.Http.Mvc

この質問からのTroy Daiの礼儀: なぜ私のASP.NET Web API ActionFilterAttribute OnActionExecutingが起動しないのですか?

0
mcheah

あなたはHttpResponseMessageを使用してそのような応答を作成することができます

var output =  new Result() { Status = Status.Error.ToString(), Data = null, Message = arr };
actionContext.Response = new HttpResponseMessage {
                Content = new StringContent(JsonConvert.SerializeObject(output), Encoding.UTF8, "application/json"),
                StatusCode = HttpStatusCode.OK
            };
0
tchno0l0ogy