包装所有ASP.net json响应/返回一个匿名对象

时间:2014-09-12 12:56:13

标签: c# asp.net json angularjs

我是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);

        }

    }
}

1 个答案:

答案 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,

卡斯帕