2014-09-12 60 views
-1

我是新来ASP.net(Visual Studio 2010中,.NET 3.5),我想做到以下几点:包装所有ASP.net JSON响应/返回一个匿名对象

我使用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

由于您使用在客户端上AngularJS,因此直接食用的JSON响应不存在反序列化(或任何类似的是)在客户端上。您正在向客户端传递一个可直接由AngularJS(或任何其他JS客户端)使用的“javascript对象”。

与匿名对象相比,使用类型化对象(使用简单成员变量!)在服务器上没有序列化惩罚。 我个人更喜欢任何一天打字对象。

至于返回对象的结构,使用异常将会更容易和更清晰,并且允许承诺链中的失败回调负责错误处理。 也就是说如果你抛出一个异常,服务器端会通过像这样被抓:

$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,

卡斯帕

+0

感谢卡斯帕尔,遗憾或不响应更快。我曾希望能避免严格定义被发回的对象,但我认为情况并非如此,实际上这并不是什么大事。 – 2015-03-05 11:41:13