包装所有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);
        }
    }
}

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

由于您在客户端上使用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,

容器