Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 向所有WebApi添加额外的json结构';什么样的反应?_Asp.net_Json_Asp.net Web Api - Fatal编程技术网

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