<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      WCF RESTful服務(wù)的Google Protocol Buffers超媒體類型

      Protocol Buffers 是在一個很理想的結(jié)構(gòu)化數(shù)據(jù)的語言中立的序列化格式。你可以考慮一下XML或JSON,但更輕,更小的協(xié)議緩沖區(qū)。 這種格式的廣應(yīng)用于谷歌不同的系統(tǒng)之間交換數(shù)據(jù)。

      由于其結(jié)構(gòu)化數(shù)據(jù)的最佳表現(xiàn),protocol buffers 是一個代表RESTful服務(wù)處理的數(shù)據(jù)很好的選擇。要遵循REST的原則, protocol buffers 應(yīng)作為一個新的超媒體類型的代表。 在當(dāng)前版本(.NET 4) 的Windows通訊基礎(chǔ)(WCF),包含一個新的媒體類型,需要相當(dāng)數(shù)量的努力。 幸運(yùn)的是,新版本的WCF HTTP堆棧,使媒體類型的WCF編程模型的一等公民,大家可以Glenn Block’s 博客去了解更詳細(xì)的內(nèi)容。推薦大家假期可以看下這本書《REST實(shí)戰(zhàn)》http://book.douban.com/subject/6854551/

      下面我們來介紹如何使用Google Protocol Buffers,只定義一個超媒體類型 ProtoBufferFormatter:

      自定義超媒體類型是通過創(chuàng)建自定義的MediaTypeFormatter,實(shí)現(xiàn)OnWritetoStream() 和 OnReadFromStream() 方法進(jìn)行序列化和反序列化處理。人們經(jīng)常認(rèn)為媒體類型只是在服務(wù)端使用,但是它用來在客戶端控制序列化和反序列化的要求,下圖顯示了一個HTTP 請求/響應(yīng)和媒體類型格式化扮演的角色:

      MediaTypeFormatterProcess

      這個例子我們使用入門:構(gòu)建簡單的Web API 的代碼和WCF Web API Preview 6。使用的媒體類型是application/x-protobuf ,REST服務(wù)的核心原則就是服務(wù)器和客戶端之間的松耦合性,客戶端需要知道書簽的URI,但不應(yīng)該知道任何其他的URI的知識,但是客戶端必須知道鏈接關(guān)系。

      image

      下面的代碼是自定義的ProtoBufferFormatter,構(gòu)造函數(shù)里指明了支持的媒體類型 application/x-protobuf。

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Web;
      using System.Net.Http.Formatting;
      using System.IO;
      using ProtoBuf;
      using ProtoBuf.Meta;

      namespace WcfWebFormat.Formatters
      {
          public class ProtoBufferFormatter : MediaTypeFormatter
          {
              public ProtoBufferFormatter()
              {
                  this.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-protobuf"));
              }

              protected override void OnWriteToStream(Type type, object value, Stream stream, System.Net.Http.Headers.HttpContentHeaders contentHeaders, System.Net.TransportContext context)
              {
                  Serializer.Serialize(stream, value); 
              }

              protected override object OnReadFromStream(Type type, Stream stream, System.Net.Http.Headers.HttpContentHeaders contentHeaders)
              {
                  object obj = (RuntimeTypeModel.Default).Deserialize(stream, null, type);
                  return obj;
              }

          }
      }

      如上所示,我們在OnWriteToStream方法中將.NET對象序列化為ProtoBuf格式,在OnReadFromStream方法中將ProtoBuf格式飯序列化為.NET對象。

      現(xiàn)在需要給我們的.NET對象加入ProtoBuf 序列化的標(biāo)簽:

      using System.Collections.Generic;
      using System.Xml.Serialization;
      using ProtoBuf;

      namespace ContactManager.Resources
      {
          [ProtoContract]
          public class Contact
          {
              [ProtoMember(1)]
              public int ContactId { get; set; }
              [ProtoMember(2)]
              public string Name { get; set; }
          }
      }

      把ProtoBufferFormatter 加入到WCF運(yùn)行時的超媒體類型集合里。

      using Microsoft.ApplicationServer.Http;
      using WcfWebFormat.Formatters;

      namespace ContactManager
      {
          public class ContactManagerConfiguration : HttpConfiguration
          {
              public ContactManagerConfiguration()
              {
                  this.Formatters.Add(new ProtoBufferFormatter());
              }
          }
      }

      修改服務(wù)配置,使用ContactManagerConfiguration:

      var config = new ContactManagerConfiguration() { EnableTestClient = true };
      routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory() { Configuration = config }, typeof(ContactsApi)));

      在客戶端調(diào)用的代碼如下:

                 var serviceUri = new Uri("http://localhost:9000/api/contacts/");
                  var httpClient = new HttpClient();
                  httpClient.BaseAddress = serviceUri;
                  httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/x-protobuf"));

                  var response = httpClient.GetAsync("1").Result;
                  Contact obj = (RuntimeTypeModel.Default).Deserialize(response.Content.ReadAsStreamAsync().Result, null, typeof(Contact)) as Contact;

                  var formatters = new MediaTypeFormatterCollection() { new ProtoBufferFormatter() };
                  var content = new ObjectContent<Contact>(obj, "application/x-protobuf",formatters);
                  content.Headers.ContentType = new MediaTypeHeaderValue("application/x-protobuf");

                  httpClient.PostAsync(serviceUri,content);

      即使目前來說Google Protocol Buffers沒有XML/JSON那樣普及,RESTful服務(wù)使用中ProtoBuf無疑是一個非常有效的超媒體類型。祝大家龍年新春愉快,吉祥如意!

      相關(guān)文章:

      posted @ 2012-01-22 11:52  張善友  閱讀(4962)  評論(5)    收藏  舉報
      主站蜘蛛池模板: 激情在线一区二区三区视频| 亚洲免费人成在线视频观看| 香蕉久久夜色精品国产成人| 亚洲中文字幕久久精品码| A毛片毛片看免费| 一本久道中文无码字幕av| 无码av人片在线观看天堂| 久久精品激情亚洲一二区| 亚洲卡1卡2卡新区网站| 精品国产av无码一区二区三区| 欧美一本大道香蕉综合视频| 久久美女夜夜骚骚免费视频| 国产精品久久中文字幕| 久久久精品波多野结衣av| 国产免费一区二区不卡| 天天综合色一区二区三区| 亚洲鸥美日韩精品久久| 丰满少妇呻吟高潮经历| 国产精品中文字幕视频| 国产精品老熟女一区二区| 国产精品国产三级国av| 一个人在看www免费| 国产无人区码一区二区| 亚洲精品电影院| 久9视频这里只有精品| 精品黄色av一区二区三区| 亚洲第一精品一二三区| 国产成人高清亚洲综合| 欧美老少配性行为| 国产精品区一二三四久久| 无遮高潮国产免费观看| 国产亚洲精品中文字幕| 日韩秘 无码一区二区三区| 亚洲va久久久噜噜噜久久狠狠| 国产稚嫩高中生呻吟激情在线视频| 中文字幕成熟丰满人妻| 国产精品系列在线免费看| 久久久国产精品樱花网站| 国产 精品 自在 线免费| 99精品视频在线观看免费蜜桃| 国产欧洲欧洲久美女久久|