我是ASP.net(Visual Studio 2010,.NET 3.5)的新手,我想做以下事情:
我正在使用OperationContracts将Web服务数据作为JSON提供。用angularJS编写的移动应用程序正在使用这些JSON响应。
我希望每个OperationContract响应都是由标准响应对象包装的相关数据对象。
e.g:
{
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);
}
}
}
答案 0 :(得分:1)
由于您在客户端上使用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,
卡斯帕