`
yzd
  • 浏览: 1887774 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

用JSON做数据传输格式中的一些问题总结

 
阅读更多

在Web数据处理方面已经占据了一定的位置,这段时间涉及到用Json做为数据传输格式的项目有3个,其中有部分页面就采用了Json 数据传输格式, 这里我总结下这段时间采用这种方式的一些问题总结,

向客户端提供JSON数据的方式

一. 用WCF提供Json数据

用WCF向客户端提供Json数据我们需要注意,

A. 契约的定义, 在WebInvokeAttribute 或者 WebGetAttribute中的ResponseFormat设置为WebMessageForm.Json,

 

 [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
 
[WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "IsExistSSID/{SSID}", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]

 

B. EndPointBehavior使用WebHttp

        <behavior name="UIAjaxEndpointBehavior">
          <webHttp />
          <PolicyEndPointBehavior />
        </behavior>

C. Binding 方式使用webHttpBinding

      <service name="XX.DeviceUIService" behaviorConfiguration="UIAjaxServiceBehavior">
        <endpoint address="" behaviorConfiguration="UIAjaxEndpointBehavior"
          binding="webHttpBinding" contract="DeviceUIServiceContract" />
      </service>

 

二. 用.Net MVC Action提供 JSON 数据

1. 在ValueProviderFactories.Factories.Add(new JsonValueProviderFactory())中加入 Json 数据的处理, MVC 3默认是加入的, 如果你使用的是 MVC3, 则无需理会这一点.

 

2. 采用JsonResult作为你Action的返回值。

3.返回是使用return Json(XXX); XXX为你要返回的数据,其数据类型必须为可序列化类型.

 

三. 可采用以asmx为后缀名的简单WebService来实现,

四. 使用HttpHandler机制来实现.

 

因为WCF已被微软定义为微软系下的通信平台,而后两种随可以实现,但是是较早的实现方式,所以在此我使用了WCF,直接把所提供的数据,视作系统的数据提供接口.

而在.NET MVC的环境里, 已经直接支持输出 Json 形式的数据,所以在非.NET MVC的环境选择WCF提供, 而在.NET MVC环境直接选择用JSON Action支持.

 

WEB客户端处理

用JQuery Ajax处理

把 dataType设置为 'json' 格式,在接收数据时会自动把result转换为json object格式.

                $.ajax({
                    url: ‘urladdress’
                    type: 'GET',
                    contentType: 'application/json',
                    dataType: 'json',
                    cache: false,
                    async: false,
                    error: JQueryAjaxErrorHandler,
                    success: function (result) { }
                });

异常处理的考虑

在这里我主要考虑在Web环境下异常的处理, 根据HTTP协议的定义, 每次请求都会返回一个 HTTP Status Code , 不同的Code代表了不同的意义。因此我们的Web应用程序也应该是这样,根据不同的结果返回不同的 HTTP Status Code , 比如200,代表服务端正确的返回,417代表我们期望的服务端异常,404,请求不存在等, 以及301我们的未授权。

在WCF环境下,我们首先要给每个方法添加 FaultContract, 如下:

FaultContract(typeof(WebFaultException<WebErrorDetail>))

其次我们要对异常做一些处理,让服务端能返回正确的HTTP Status Code.
            try
            {
                 //BussinessCode.....
            }
            catch (DuplicateException ex)
            {
                throw new WebFaultJsonFormatException<WebErrorDetail>(new WebErrorDetail(ex.Message, ex), HttpStatusCode.ExpectationFailed);
            }
            catch (NotExistException ex)
            {
                throw new WebFaultJsonFormatException<WebErrorDetail>(new WebErrorDetail(ex.Message, ex), HttpStatusCode.ExpectationFailed);
            }
            catch (AppException ex)
            {
                throw new WebFaultJsonFormatException<WebErrorDetail>(new WebErrorDetail(ex.Message, ex), HttpStatusCode.ExpectationFailed);
            }
            catch (Exception ex)
            {
                throw new WebFaultJsonFormatException<WebErrorDetail>(new WebErrorDetail(ex.Message, ex), HttpStatusCode.ExpectationFailed);
            }


其中WebFaultJsonFormatException的签名如下:

    [Serializable, DataContract]
    public class WebFaultJsonFormatException<T> : WebFaultException<T>
    {
        public WebFaultJsonFormatException(T detail, HttpStatusCode statusCode)
            : base(detail, statusCode)
        {
            ErrorDetailTypeValidator(detail);
        }
        public WebFaultJsonFormatException(T detail, HttpStatusCode statusCode, IEnumerable<Type> knownTypes)
            : base(detail, statusCode, knownTypes)
        {
            ErrorDetailTypeValidator(detail);
        }

        private void ErrorDetailTypeValidator(T detail)
        {
            foreach (DataContractAttribute item in detail.GetType().GetCustomAttributes(typeof(DataContractAttribute), true))
            {
                if (item.IsReference)
                    throw new WebFaultJsonFormatException<PureWebErrorDetail>(new PureWebErrorDetail("The DataContractAttribute property 'IsReference' which applied on {0} can't be true when the transfer code type is JSON fromat.", typeof(T).FullName), HttpStatusCode.ExpectationFailed);

            }
        }

    }

    [Serializable, DataContract(IsReference = false)]
    public class PureWebErrorDetail
    {
        public PureWebErrorDetail(string message, params object[] args)
        {
            this.Message = string.Format(message, args);
        }

        [DataMemberAttribute]
        public string Message { get; set; }
    }



因为我们在JSON做数据传输的时候, DataContract中的IsReference是不可以为true的,其意思是相对于XML来说的,XML是可以支持数据的循环引用, 而JSON是不支持的,所以WebFaultJsonFormatException的作用就在于判断当前我们的JSON数据类型的DataContract的IsReference是否为true, 如果是,则返回一个我们定义好的错误信息. 如果没有采用这个定义,JQUery Ajax因此问题接收到的 HTTP Status Code 是15???的一个错误代码, 但这个错误代码并不是我们正常的 HTTP Status Code 范围.

 

异常处理的一个误区

最早的时候,由于没想到用这个方式处理,也是长久写代码犯下的一个弊病, 给每个方法加了一个固定的泛型返回值类型

    [DataContract]
    public class TmResult
    {
        [DataMember]
        public bool Success { get; set; }

        [DataMember]
        public string ErrorMessage { get; set; }

        [DataMember]
        public string FullMessage { get; set; }

        [DataMember]
        public string CallStack { get; set; }
    }

    [DataContract]
    public class TmResult<T> : TmResult
        where T : class
    {
        [DataMember]
        public T Model { get; set; }
    }


每次返回都会有一个Success代表是否成功, ErrorMessage代表错误情况下的错误信息, 这样做的方式其实就是每次返回的 HTTP Status Code 都是200, 后来知道想到上面的解决办法之后,才觉得我们更本不需要搞的这么复杂,既然是Web, 那干吗不把程序写的更符合HTTP协议的定义, 那样岂不更简单。

 

所以在此也体会到各种标准的好处, 熟悉标准,熟悉编程模型及各种API, 我们的开发会更简单,更轻松.

以上都是按个人理解所写,有不对之处请指正.

0
1
分享到:
评论

相关推荐

    C#编写上位机使用UDP给单片机发送Json格式数据

    在本文中,我们将深入...总结,使用C#编写上位机并利用UDP向单片机发送Json数据涉及到了网络编程的基本概念,Json序列化,以及对无连接协议的理解。通过熟练掌握这些知识点,你可以构建出高效、可靠的设备通信系统。

    Android利用Json来进行网络数据传输

    在给定的例子中,`HttpUtils`类展示了如何使用`DefaultHttpClient`发送GET请求获取JSON数据。首先创建`HttpClient`实例,然后构造`HttpGet`对象,设置请求URL。接着执行请求并获取`HttpResponse`,从响应实体中提取...

    纯pb代码编写的解析json数据,含生成、格式化等

    标题中的“纯pb代码编写的解析json数据,含生成、格式化等”指的是使用PowerBuilder(简称PB)这种编程语言,完全不依赖其他外部库,实现了JSON数据的解析、生成和格式化的功能。PB是一种面向对象的编程工具,主要...

    C#的json数据格式转化

    JSON数据格式转换可以将C#语言中的对象转换为JSON格式的数据,然后将其存储或传输,反之亦然。 JSON数据格式转换的方法 在C#语言中,有多种方法可以实现JSON数据格式转换,下面将介绍其中的一些方法: 1. 使用...

    php-curl+ajax+json数据传输2.0版本

    总结起来,"php-curl+ajax+json数据传输2.0版本"是利用PHP-cURL解决AJAX跨域请求的一种解决方案,它结合了AJAX的异步特性、JSON的数据交换优势以及cURL的服务器端请求处理能力。这个组合可以实现高效、安全的数据...

    jsonview_json格式化

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web服务和应用程序之间的数据传输。它易于人阅读和编写,同时也易于机器解析和生成。JSON格式基于JavaScript的一个子集,但它是独立于...

    spring3.x前后端使用json传输数据

    总结起来,Spring 3.x中通过JSON进行前后端数据传输主要涉及以下几个步骤: 1. 引入Jackson库。 2. 配置Spring的`&lt;mvc:annotation-driven/&gt;`以启用注解驱动。 3. 使用jQuery或类似库发送JSON数据。 4. 在Controller...

    java+json数据格式例子

    在Java中,处理JSON数据是常见的任务,尤其是在前后端交互中,JSON作为数据传输的载体,使得无刷新页面更新成为可能。 在前端,JavaScript可以方便地创建和操作JSON对象。例如,假设我们有一个用户对象,包含用户名...

    C++ 实现json形式的Socket传输图片

    在C++中,可以使用第三方库如nlohmann/json或RapidJSON来处理JSON数据。 3. **Socket编程**: Socket是网络编程的基本接口,它允许程序通过网络发送和接收数据。在C++中,可以使用标准库中的`&lt;sys/socket.h&gt;`和`...

    cJSON.rar_cjson_json c++ 简单_json 协议_json数据传输

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web服务和应用程序之间的数据传输。它基于JavaScript的一个子集,设计为人类可读且易于机器解析和生成。JSON格式简洁明了,通常由键值对...

    全球城市数据表和json数据

    总结起来,这个主题涵盖了数据库管理中的核心概念,如数据表结构、JSON数据格式以及索引的创建和使用。理解并掌握这些知识对于任何处理大量结构化数据的IT专业人员都至关重要,无论是数据分析师、数据库管理员还是...

    android demo,json数据格式的案例的应用

    在Android开发中,JSON(JavaScript Object Notation)是一种常见的数据交换格式,被广泛用于网络通信,将服务器端的数据传输到客户端。本示例是关于如何在Android应用中解析和使用JSON数据的一个实战演示。让我们...

    PHP API接口必备之输出json格式数据示例代码

    在当前的Web服务中,JSON(JavaScript Object Notation)格式由于其轻便、跨平台的特性,已经成为API接口数据交换的首选格式。 JSON格式与PHP的结合使用,需要我们掌握几个关键的函数:json_encode和json_decode。...

    微信小程序获取json页面数据

    - **安全问题**:确保使用HTTPS协议进行数据传输,避免数据被截取。 - **跨域问题**:确保服务器端允许跨域访问。 - **错误处理**:除了处理成功的逻辑外,还应该考虑失败情况下的处理,例如网络异常、服务器故障等...

    Mixly的JSON数据收发使用说明

    ### Mixly中的JSON数据收发使用说明 #### 一、Mixly与JSON数据收发概述 在Mixly这款流行的图形化编程环境中,JSON数据收发功能的加入极大地简化了开发者在进行设备间通信时的工作流程。传统的单片机通信通常需要...

    Android 将网络返回的Json数据格式化

    本教程将详细介绍如何在Android中接收、格式化Json数据,并结合Retrofit网络请求框架进行高效的数据操作。 一、理解Json格式 Json是一种基于文本的数据格式,它以键值对的形式存储数据,支持数组和对象。例如: ```...

    MySQL数据生成JSON数据

    MySQL是一种广泛使用的开源关系型数据库管理系统,而JSON(JavaScript Object Notation)则是一种轻量级的数据交换格式,常用于Web服务和前后端数据传输。在MySQL中,将数据转换为JSON格式是常见的需求,尤其在处理...

    易语言正则取Json数据源码

    总结来说,这个资源是关于在易语言中使用正则表达式处理Json数据的代码示例,对于需要从Json数据中提取信息的易语言开发者来说,这是一个非常实用的学习材料。通过阅读和理解这段源码,开发者可以提升自己在处理网络...

Global site tag (gtag.js) - Google Analytics