包装所有ASP.net json响应/返回一个匿名对象
本文关键字:一个 对象 返回 ASP net json 响应 包装 | 更新日期: 2023-09-27 18:21:36
我是ASP.net(Visual Studio 2010,.net 3.5)的新手,我想做以下事情:
我使用OperationContracts以JSON的形式提供Web服务数据。一个用angularJS编写的移动应用程序正在使用这些JSON响应。
我希望每个OperationContract响应都是由标准响应对象包装的相关数据对象。
例如:
{
error: false,
error_detail: '',
authenticated: false,
data: { }
}
在数据变量中,将是每个单独请求类型所需的任何内容。
移动应用程序检查相关变量,如果一切正常,则将数据传递给任何请求它的人(此部分正在工作并准备就绪)。
我知道这通常是不受欢迎的,但我曾希望基本上返回一个匿名对象,因为我可以很容易地构建一个匿名的对象,并在我需要的任何数据中填充内容,但我似乎被强烈拒绝了这样做的能力。理想情况下,我不想在移动应用程序端添加另一层反序列化或其他内容,我希望在客户端尽可能少地进行处理。
通过我自己的测试Web API项目(参见下面的示例控制器),我很容易就可以根据需要实现这一点,但不幸的是,我正在添加到现有项目中,而不是开始新项目。
有人能提供什么建议吗?
示例Web API代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace tut3.Controllers
{
public class ValuesController : ApiController
{
/**
* Take the provided dataResponse object and embed it into
* the data variable of the default response object
**/
private object Response(object dataResponse)
{
return new
{
success = false,
error = "",
error_detail = "",
authenticated = false,
token = "",
token_expiry = 0,
data = dataResponse
};
}
/**
* This could be a normal web service that uses the Knadel database etc etc, the only difference is
* the return is sent through the Response() function
**/
public object Get()
{
object[] local = new[] {
new { cat = "cat", dog = "dog" },
new { cat = "cat", dog = "dog" },
new { cat = "cat", dog = "dog" },
new { cat = "cat", dog = "dog" },
new { cat = "cat", dog = "dog" }
};
/**
* Pass local to Response(), embed it in data and then return the whole thing
**/
return Response(local);
}
}
}
由于您在客户端上使用AngularJS,因此直接使用JSON响应,因此客户端上没有反序列化(或类似的操作)。您正在向客户端传递一个"javascript对象",AngularJS(或任何其他JS客户端)可以直接使用该对象。
与匿名对象相比,使用类型化对象(带有简单成员变量!)不会对服务器造成序列化惩罚。我个人更喜欢打字对象。
至于返回对象的结构,使用异常并让promise链中的失败回调负责错误处理会更容易,也更干净。也就是说,如果你在服务器端抛出一个异常,它会被这样的东西捕获:
$http.get('yourServerUrl').then(function successCallback(result){
// Everything went well, display the data or whatever
}, function errorCallback(error){
// Something went wrong,
// the error object will contain statusCode and the message from the exception
});
令牌、身份验证信息等实际上应该放在http头中,而不是放在响应体中。
HTH,
容器