最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用JSON做數(shù)據(jù)傳輸格式中的一些問題總結(jié)

 更新時間:2011年12月21日 19:08:46   作者:  
Json 憑借其自身的優(yōu)勢,在Web數(shù)據(jù)處理方面已經(jīng)占據(jù)了一定的位置,這段時間涉及到用Json做為數(shù)據(jù)傳輸格式的項目有3個,其中有部分頁面就采用了Json 數(shù)據(jù)傳輸格式, 這里我總結(jié)下這段時間采用這種方式的一些問題總結(jié)
向客戶端提供JSON數(shù)據(jù)的方式
一. 用WCF提供Json數(shù)據(jù)
用WCF向客戶端提供Json數(shù)據(jù)我們需要注意,
A. 契約的定義, 在WebInvokeAttribute 或者 WebGetAttribute中的ResponseFormat設(shè)置為WebMessageForm.Json,
復(fù)制代碼 代碼如下:

[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
復(fù)制代碼 代碼如下:

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

C. Binding 方式使用webHttpBinding
復(fù)制代碼 代碼如下:

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

二. 用.Net MVC Action提供 JSON 數(shù)據(jù)
1. 在ValueProviderFactories.Factories.Add(new JsonValueProviderFactory())中加入 Json 數(shù)據(jù)的處理, MVC 3默認是加入的, 如果你使用的是 MVC3, 則無需理會這一點.
2. 采用JsonResult作為你Action的返回值。
3.返回是使用return Json(XXX); XXX為你要返回的數(shù)據(jù),其數(shù)據(jù)類型必須為可序列化類型.
三. 可采用以asmx為后綴名的簡單WebService來實現(xiàn),
四. 使用HttpHandler機制來實現(xiàn).
因為WCF已被微軟定義為微軟系下的通信平臺,而后兩種隨可以實現(xiàn),但是是較早的實現(xiàn)方式,所以在此我使用了WCF,直接把所提供的數(shù)據(jù),視作系統(tǒng)的數(shù)據(jù)提供接口.
而在.NET MVC的環(huán)境里, 已經(jīng)直接支持輸出 Json 形式的數(shù)據(jù),所以在非.NET MVC的環(huán)境選擇WCF提供, 而在.NET MVC環(huán)境直接選擇用JSON Action支持.
WEB客戶端處理
用JQuery Ajax處理
把 dataType設(shè)置為 'json' 格式,在接收數(shù)據(jù)時會自動把result轉(zhuǎn)換為json object格式.
復(fù)制代碼 代碼如下:

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

異常處理的考慮

在這里我主要考慮在Web環(huán)境下異常的處理, 根據(jù)HTTP協(xié)議的定義, 每次請求都會返回一個 HTTP Status Code , 不同的Code代表了不同的意義。因此我們的Web應(yīng)用程序也應(yīng)該是這樣,根據(jù)不同的結(jié)果返回不同的 HTTP Status Code , 比如200,代表服務(wù)端正確的返回,417代表我們期望的服務(wù)端異常,404,請求不存在等, 以及301我們的未授權(quán)。

在WCF環(huán)境下,我們首先要給每個方法添加 FaultContract, 如下:
FaultContract(typeof(WebFaultException<WebErrorDetail>))
其次我們要對異常做一些處理,讓服務(wù)端能返回正確的HTTP Status Code.

復(fù)制代碼 代碼如下:

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做數(shù)據(jù)傳輸?shù)臅r候, DataContract中的IsReference是不可以為true的,其意思是相對于XML來說的,XML是可以支持數(shù)據(jù)的循環(huán)引用, 而JSON是不支持的,所以WebFaultJsonFormatException的作用就在于判斷當前我們的JSON數(shù)據(jù)類型的DataContract的IsReference是否為true, 如果是,則返回一個我們定義好的錯誤信息. 如果沒有采用這個定義,JQUery Ajax因此問題接收到的 HTTP Status Code 是15???的一個錯誤代碼, 但這個錯誤代碼并不是我們正常的 HTTP Status Code 范圍.

異常處理的一個誤區(qū)
最早的時候,由于沒想到用這個方式處理,也是長久寫代碼犯下的一個弊病, 給每個方法加了一個固定的泛型返回值類型
復(fù)制代碼 代碼如下:

[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, 后來知道想到上面的解決辦法之后,才覺得我們更本不需要搞的這么復(fù)雜,既然是Web, 那干嗎不把程序?qū)懙母螲TTP協(xié)議的定義, 那樣豈不更簡單。

所以在此也體會到各種標準的好處, 熟悉標準,熟悉編程模型及各種API, 我們的開發(fā)會更簡單,更輕松.
以上都是按個人理解所寫,有不對之處請指正.

相關(guān)文章

  • 利用json獲取字符出現(xiàn)次數(shù)的代碼

    利用json獲取字符出現(xiàn)次數(shù)的代碼

    之前看到一篇博客,列出一個字符串中每個字符出現(xiàn)的次數(shù),后來想想可以不可以用json來實現(xiàn)呢,結(jié)果當然是可以的,廢話就不多說了
    2012-03-03
  • 一文了解什么是JWT

    一文了解什么是JWT

    JSON?WEB?Token是一種基于JSON的、用于在網(wǎng)絡(luò)上聲明某種主張的令牌,由三部分組成:?頭信息,?消息體和簽名,下面就一起來了解一下什么是JWT
    2023-05-05
  • ajax處理php返回json數(shù)據(jù)的實例代碼

    ajax處理php返回json數(shù)據(jù)的實例代碼

    有時候我們需要ajax處理php返回的json數(shù)據(jù),適合經(jīng)常用php開發(fā)的朋友,需要的朋友可以參考下
    2013-01-01
  • js解析與序列化json數(shù)據(jù)(一)json.stringify()的基本用法

    js解析與序列化json數(shù)據(jù)(一)json.stringify()的基本用法

    對象有兩個方法:stringify()和parse()。在最簡單的情況下,這兩個方法分別用于把JavaScript對象序列化為JSON字符串和把JSON字符串解析為原生JavaScript
    2013-02-02
  • 比較詳細的關(guān)于javascript 解析json的代碼

    比較詳細的關(guān)于javascript 解析json的代碼

    JSON (JavaScript Object Notation)一種簡單的數(shù)據(jù)格式,比xml更輕巧。 JSON 是 JavaScript 原生格式,這意味著在 JavaScript 中處理 JSON 數(shù)據(jù)不需要任何特殊的 API 或工具包。
    2009-12-12
  • JSON.parse 數(shù)據(jù)不完整的解決方法

    JSON.parse 數(shù)據(jù)不完整的解決方法

    本文主要介紹了JSON.parse 數(shù)據(jù)不完整的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Javascript生成json的函數(shù)代碼(可以用php的json_decode解碼)

    Javascript生成json的函數(shù)代碼(可以用php的json_decode解碼)

    這幾天迷上了JSON,連項目中一些XML的工作都交給了JSON,話說JSON真的比XML方便的多啊
    2012-06-06
  • js實現(xiàn)刪除json中指定的元素

    js實現(xiàn)刪除json中指定的元素

    這篇文章主要介紹了js實現(xiàn)刪除json中指定的元素,需要的朋友可以參考下
    2020-09-09
  • XENON基于JSON變種

    XENON基于JSON變種

    JSON已經(jīng)成為了現(xiàn)在互聯(lián)網(wǎng)上輕量級數(shù)據(jù)傳輸?shù)氖聦崢藴?,現(xiàn)在已經(jīng)很少聽說哪個流行的web API不支持JSON了,而很多內(nèi)部或者專用的應(yīng)用程序也都在使用JSON來傳遞數(shù)據(jù)。
    2010-07-07
  • json編寫簡單一例

    json編寫簡單一例

    主要是了解一下json的簡單寫法與應(yīng)用,方便想學(xué)習(xí)json的朋友
    2008-08-08

最新評論

庆云县| 手游| 洛隆县| 嘉义县| 那坡县| 确山县| 新竹市| 石门县| 南郑县| 普安县| 安塞县| 阿图什市| 阿巴嘎旗| 营口市| 乌拉特后旗| 方山县| 滕州市| 临安市| 招远市| 阿克苏市| 平邑县| 北票市| 九龙城区| 三穗县| 崇左市| 南和县| 丹凤县| 罗山县| 合水县| 淮南市| 新和县| 宜宾县| 达日县| 大足县| 于田县| 河北省| 平潭县| 青海省| 遂川县| 北川| 多伦县|