【问题标题】:Asp.net Web API - return data from actionfilterAsp.net Web API - 从 actionfilter 返回数据
【发布时间】:2013-06-23 10:37:47
【问题描述】:

我想从 wep api actionfilter 返回一个 json 对象。 我怎样才能做到这一点?

我可以从动作中返回对象,但我需要在某些条件下从动作过滤器中返回一些数据。

提前致谢。


编辑: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);
        }     


    }
}

【问题讨论】:

    标签: c# asp.net-web-api action-filter


    【解决方案1】:

    您只需要分配响应:

    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";
    }
    

    此自定义操作过滤器将短路操作的执行并直接返回我们提供的响应。

    【讨论】:

    • 如何在 .net core 中做到这一点?
    • 对我来说,上述解决方案不起作用。动作中的代码仍然被执行。
    • @GilesRoberts 我尝试调用actionContext.ModelState.AddModelError() 使模型无效。然后我正在检查if (!context.ModelState.IsValid),如果它无效,则返回错误。 Json 错误显示在浏览器窗口中(或通过 curl.exe 工具)
    • 谁能告诉我控制器如何使用动作过滤器响应?对于上面的示例,我想在我的控制器中使用“bar”值。如何做到这一点?
    【解决方案2】:

    你可以使用 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
                };
    

    【讨论】:

      【解决方案3】:

      只是把它扔在那里,以防其他人像我一样来到这里并没有找到他们问题的答案:

      您可能使用了错误的导入 - 您有 2 个选项:

      • System.Web.Http.Filters
      • System.Web.Mvc(或System.Web.Http.Mvc

      Troy Dai 来自这个问题:Why is my ASP.NET Web API ActionFilterAttribute OnActionExecuting not firing?

      【讨论】:

        猜你喜欢
        • 2018-05-06
        • 1970-01-01
        • 2017-05-28
        • 2015-01-05
        • 1970-01-01
        • 2018-07-17
        • 1970-01-01
        相关资源
        最近更新 更多