为所有WebApi的响应添加额外的json结构?

Roy*_*mir 2 asp.net json asp.net-web-api

我们正在与移动软件公司合作,在移动设备上完成我们的应用程序.

我们的控制器有(简化)方法,如:

api/users/1
–GetUserById(...)

api/users/changePassword
–ChangePassword(Person p)
Run Code Online (Sandbox Code Playgroud)

好.

ChangePassword可以返回一些应用性的错误代码(密码已经使用,密码太短,密码喇嘛喇嘛...)

因此,例如,如果已经使用了密码,那么HttpCode 应该200返回附加信息

我们就每个回复达成了这个约定:( 响应数据外)

{
 "Success":0,
 "ErrorCode": 6,
 "ErrorMessage":"already used"
}
Run Code Online (Sandbox Code Playgroud)

但正如我所说,这种结构应该在每一个回应中.

所以到现在为止 - 例如:api/users/1 返回:

{
 "userId":1,
 "name":"John"
}
Run Code Online (Sandbox Code Playgroud)

但现在 - 响应应该是:

{

 "data":
   {
    "userId":1,
    "name":"John"
   }
,
 "result": //no errors
    {
     "Success":0,
     "ErrorCode": 0,
     "ErrorMessage":""
    }

}
Run Code Online (Sandbox Code Playgroud)

他们总是在寻找"结果"对象来查看应用反应.

我假设我应该做的地方是在消息处理程序之后base.SendAsync(响应部分)

但是我应该如何Request.CreateResponseMessage使用格式+值包装我发送的常规响应:

在此输入图像描述

NB,当然在Request.CreateResponseMessage阶段I已经有了具有适当结果代码的结果对象.

Bad*_*dri 5

当消息处理程序在Web API管道中运行时,您的操作方法生成的结果将被序列化.动作过滤器是更好的选择,因为你可以处理对象,你可以做这样的事情.

public class MyActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext context)
    {
        var content = context.Response.Content as ObjectContent;
        if (content != null)
        {
            content.Value =
                new MyResponse()
                {
                    Result = new Result() { Success = 0, ErrorCode = 6 },
                    Data = content.Value
                };
        }
    }
}

public class Result
{
    public int Success { get; set; }
    public int ErrorCode { get; set; }
}

public class MyResponse
{
    public Result Result { get; set; }
    public object Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

注意:上面的代码仅适用于JSON而不适用于XML.