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);
}
}
}
必要なのは、応答を割り当てることだけです。
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";
}
このカスタムアクションフィルターは、アクションの実行を短絡し、提供した応答を直接返します。
私のように誰かがここに来て、彼らの問題に対する答えを見つけられない場合に備えて、これを捨てるだけです。
間違ったインポートを使用している可能性があります-2つのオプションがあります。
System.Web.Http.Filters
System.Web.Mvc
(またはSystem.Web.Http.Mvc
)この質問からのTroy Daiの礼儀: なぜ私のASP.NET Web API ActionFilterAttribute OnActionExecutingが起動しないのですか?
あなたは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
};