Asp.net 向所有WebApi添加额外的json结构';什么样的反应?
我们正在与移动软件公司进行集成,以便在移动设备上实现我们的应用 我们的控制器有(简化)方法,如:Asp.net 向所有WebApi添加额外的json结构';什么样的反应?,asp.net,json,asp.net-web-api,Asp.net,Json,Asp.net Web Api,我们正在与移动软件公司进行集成,以便在移动设备上实现我们的应用 我们的控制器有(简化)方法,如: api/users/1 –GetUserById(...) api/users/changePassword –ChangePassword(Person p) 嗯 ChangePassword可以返回多个应用程序错误代码(密码已被使用,密码太短,密码bla bla…) 因此,例如,如果密码已经被使用,那么HttpCode应该返回200以及其他信息 我们对每一个响应都同意这个约定:(响应数据的附
api/users/1
–GetUserById(...)
api/users/changePassword
–ChangePassword(Person p)
嗯
ChangePassword
可以返回多个应用程序错误代码(密码已被使用,密码太短,密码bla bla…)
因此,例如,如果密码已经被使用,那么HttpCode
应该返回200
以及其他信息
我们对每一个响应都同意这个约定:(响应数据的附加值)
但正如我所说的那样,这种结构应该出现在每一个回应中
所以到目前为止-例如:api/users/1
返回:
{
"userId":1,
"name":"John"
}
但现在,答案应该是:
{
"data":
{
"userId":1,
"name":"John"
}
,
"result": //no errors
{
"Success":0,
"ErrorCode": 0,
"ErrorMessage":""
}
}
他们总是寻找“result”对象来查看应用程序的响应
问题
我假设应该在base.SendAsync
(响应部分)之后的消息处理程序中执行此操作
但是我应该如何将通过Request.CreateResponseMessage
发送的常规响应包装为以下格式+值:
注意,当然是在请求时。CreateResponseMessage
第一阶段已经有了带有相应结果代码的结果对象。您可以创建一个,在该方法上,您将获得HttpActionExecutedContext,您可以在其中检查响应消息
您可以通过此属性装饰控制器或操作,并返回并创建自己的ResponseMessage
希望对您有所帮助。当消息处理程序在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; }
}
注意:上面的代码只适用于JSON,而不适用于XML。Wow Badri,我几乎感到不舒服,但你总是用代码和解释来回答,作为对问题的准确回答。非常感谢你!。XML序列化程序无法处理
对象
。未调用我的筛选器。我遗漏了什么吗?谢谢你的回复。OnActionExecuted确实是解决方案。Omar Hi,现在可以去聊天了吗?
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; }
}