亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

如何為asp.net core添加protobuf支持詳解

2024-07-10 13:32:58
字體:
來源:轉載
供稿:網友

前言

在一些性能要求很高的應用中,使用protocol buffer序列化,優于Json。而且protocol buffer向后兼容的能力比較好。

由于Asp.net coreldraw/180070.html">core 采用了全新的MiddleWare方式,因此使用protobuf序列化,只需要使用Protobuf-net修飾需要序列化的對象,并在MVC初始化的時候增加相應的Formatter就可以了。

沒時間解釋了,快上車。

通過NuGet獲取Zaabee.AspNetCoreProtobuf

Install-Package Zaabee.AspNetCoreProtobuf

在Startup.cs文件中修改ConfigureServices方法

public void ConfigureServices(IServiceCollection services){  services.AddMvc(options => { options.AddProtobufSupport(); });}

搞掂……這時候你就可以通過application/x-protobuf的content-type來讓asp.net core使用protobuf來進行序列化/反序列化。

測試代碼

在asp.net core項目中添加以下DTO

[ProtoContract]public class TestDto{  [ProtoMember(1)] public Guid Id { get; set; }  [ProtoMember(2)] public string Name { get; set; }  [ProtoMember(3)] public DateTime CreateTime { get; set; }  [ProtoMember(4)] public List<TestDto> Kids { get; set; }  [ProtoMember(5)] public long Tag { get; set; }  [ProtoMember(6)] public TestEnum Enum { get; set; }}public enum TestEnum{  Apple,  Banana,  Pear}

新建一個XUnit項目,通過Nuget引用Microsoft.AspNetCore.TestHost,建立一個測試類

public class AspNetCoreProtobufTest{  private readonly TestServer _server;  private readonly HttpClient _client;  public AspNetCoreProtobufTest()  {    _server = new TestServer(      new WebHostBuilder()        .UseKestrel()        .UseStartup<Startup>());    _client = _server.CreateClient();  }  [Fact]  public void Test()  {    // HTTP Post with Protobuf Response Body    _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-protobuf"));    var dtos = GetDtos();    var stream = new MemoryStream();    ProtoBuf.Serializer.Serialize(stream, dtos);    HttpContent httpContent = new StreamContent(stream);    // HTTP POST with Protobuf Request Body    var responseForPost = _client.PostAsync("api/Values", httpContent);    var result = ProtoBuf.Serializer.Deserialize<List<TestDto>>(      responseForPost.Result.Content.ReadAsStreamAsync().Result);    Assert.True(CompareDtos(dtos,result));  }  private static bool CompareDtos(List<TestDto> lstOne, List<TestDto> lstTwo)  {    lstOne = lstOne ?? new List<TestDto>();    lstTwo = lstTwo ?? new List<TestDto>();    if (lstOne.Count != lstTwo.Count) return false;    for (var i = 0; i < lstOne.Count; i++)    {      var dtoOne = lstOne[i];      var dtoTwo = lstTwo[i];      if (dtoOne.Id != dtoTwo.Id || dtoOne.CreateTime != dtoTwo.CreateTime || dtoOne.Enum != dtoTwo.Enum ||        dtoOne.Name != dtoTwo.Name || dtoOne.Tag != dtoTwo.Tag || !CompareDtos(dtoOne.Kids, dtoTwo.Kids))        return false;    }    return true;  }  private static List<TestDto> GetDtos()  {    return new List<TestDto>    {      new TestDto      {        Id = Guid.NewGuid(),        Tag = long.MaxValue,        CreateTime = DateTime.Now,        Name = "0",        Enum = TestEnum.Apple,        Kids = new List<TestDto>        {          new TestDto          {            Id = Guid.NewGuid(),            Tag = long.MaxValue - 1,            CreateTime = DateTime.Now,            Name = "00",            Enum = TestEnum.Banana          },          new TestDto          {            Id = Guid.NewGuid(),            Tag = long.MaxValue - 2,            CreateTime = DateTime.Now,            Name = "01",            Enum = TestEnum.Pear          }        }      },      new TestDto      {        Id = Guid.NewGuid(),        Tag = long.MaxValue - 3,        CreateTime = DateTime.Now,        Name = "1",        Enum = TestEnum.Apple,        Kids = new List<TestDto>        {          new TestDto          {            Id = Guid.NewGuid(),            Tag = long.MaxValue - 4,            CreateTime = DateTime.Now,            Name = "10",            Enum = TestEnum.Banana          },          new TestDto          {            Id = Guid.NewGuid(),            Tag = long.MaxValue - 5,            CreateTime = DateTime.Now,            Name = "11",            Enum = TestEnum.Pear          }        }      }    };  }}

為什么要用protobuf?

因為快……在我們這邊使用業務數據的測試中,protobuf的序列化/反序列化性能大概是Json.net的三倍,序列化后的體積大概只有Json的二分之一,這可以在相當程度上提高webapi的吞吐性能。

另外就是Json對于浮點數的處理存在精度丟失,因為JS的number類型的安全整數是53位。當我們使用雪花算法來提供全局遞增ID時會因為精度丟失導致重復主鍵。而且情況不僅如此,由于同樣原因傳遞DateTime類型也會因為毫秒不一致導致時間匹配錯誤。一般的解決方法是使用字符串傳遞,不過這畢竟屬于偏方并沒有從根源上解決問題,因此我們還是直接使用protobuf來處理。

protobuf的缺點

DTO層必須引用protobuf-net來添加特性,這在一定程度上導致了代碼的侵入?;旧螪TO屬于POCO,依賴第三方包的話總覺得有點不貞潔……另外就是protobuf序列化后的數據不具有可視化,因此如果是使用消息隊列或者請求監控的地方,就要綜合考慮protobuf是否適合使用場景。

原理

asp.net core是基于中間件方式來實現,其自帶默認的JsonFormater(基于Json.net),asp.net core會根據content type來選擇對應的Formater來處理對象的序列化,當中包括InputFormatter(反序列化)和OutputFormatter(序列化)。因此除了protobuf,我們還可以添加或者替換其它的序列化方式,例如使用Jil來代替Json.net來提高Json性能。

以上實現以及Demo和測試的源代碼已放到 GitHub 上。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品69av| 成人免费网站在线| 精品成人国产在线观看男人呻吟| 亚洲女人初尝黑人巨大| 欧美黄色片免费观看| 综合网中文字幕| 国内偷自视频区视频综合| 久久久久久亚洲精品| 日韩欧美成人精品| 日韩一中文字幕| 欧美性一区二区三区| 成人做爰www免费看视频网站| 亚洲一区二区三区视频| 亚洲色无码播放| 国产精品中文字幕在线观看| 欧美日韩亚洲视频一区| 日韩成人高清在线| 国产乱人伦真实精品视频| 中文字幕视频在线免费欧美日韩综合在线看| 欧美裸体xxxx极品少妇软件| 中文字幕视频在线免费欧美日韩综合在线看| 高清视频欧美一级| 亚洲久久久久久久久久久| 色www亚洲国产张柏芝| 亚洲国产精品999| 国产美女久久精品香蕉69| 欧美黄色片视频| 97国产精品人人爽人人做| 国产日韩精品一区二区| 国产欧美一区二区三区久久人妖| 日韩中文字幕国产精品| 免费不卡在线观看av| 91欧美激情另类亚洲| 国产99久久久欧美黑人| 欧美视频免费在线观看| 日韩欧美在线网址| 亚洲精品www久久久| 亚洲欧美激情视频| 国语自产精品视频在免费| 欧美激情免费看| 91精品在线一区| 色yeye香蕉凹凸一区二区av| 国产精品影院在线观看| 久久久久免费精品国产| 国产91露脸中文字幕在线| 国产自摸综合网| 日韩欧美在线网址| 夜夜嗨av色一区二区不卡| 亚洲视频一区二区| 国产91色在线播放| 欧美成人激情视频免费观看| 91色视频在线导航| 国产精品成人av在线| 性日韩欧美在线视频| 亚洲高清久久久久久| 国产在线拍偷自揄拍精品| 午夜精品在线视频| zzijzzij亚洲日本成熟少妇| 一区二区三区久久精品| 国产精品嫩草视频| 91禁外国网站| 亚洲国产私拍精品国模在线观看| 另类视频在线观看| 欧美视频在线观看免费网址| 91爱视频在线| 久久久久久久久久久免费精品| 毛片精品免费在线观看| 日韩av在线影视| 亚洲va男人天堂| 视频在线一区二区| 久久精品亚洲94久久精品| 日韩精品黄色网| 午夜精品蜜臀一区二区三区免费| 国产精品成熟老女人| 亚洲国产小视频在线观看| 欧美激情欧美激情在线五月| 亚洲男人第一网站| 91日本视频在线| 国产精品xxx视频| 久久精品国产96久久久香蕉| 青草青草久热精品视频在线观看| 国产精品99久久久久久久久| 日韩在线观看免费全集电视剧网站| 久热精品视频在线免费观看| 国产日本欧美在线观看| 国产婷婷97碰碰久久人人蜜臀| 久久精品免费播放| 亚洲国产成人av在线| 一区二区三区无码高清视频| 97香蕉超级碰碰久久免费软件| 亚洲天堂男人天堂女人天堂| 国产精品 欧美在线| 久久精品一偷一偷国产| 欧美裸身视频免费观看| 国产精品视频最多的网站| 美日韩精品视频免费看| 精品国产一区二区三区久久狼黑人| 九九久久久久99精品| 2019中文字幕免费视频| 国产伊人精品在线| 中文字幕日韩欧美在线| 久久午夜a级毛片| 久久大大胆人体| 一个人www欧美| 92版电视剧仙鹤神针在线观看| 国产日本欧美一区二区三区| 欧美野外wwwxxx| 欧美日韩国产一区中文午夜| 色久欧美在线视频观看| 精品国产一区久久久| 久久91亚洲精品中文字幕奶水| 欧美电影第一页| 17婷婷久久www| 久久精品国产一区二区三区| 色播久久人人爽人人爽人人片视av| 中文字幕欧美视频在线| 成人做爽爽免费视频| 日韩视频第一页| 777777777亚洲妇女| 狠狠久久五月精品中文字幕| 欧美激情videos| 国外视频精品毛片| 日韩免费av在线| 91精品国产高清久久久久久久久| 国产精品久久久久77777| 亚洲黄色成人网| 2019精品视频| 欧美性受xxxx黑人猛交| 国产精品美女视频网站| 色多多国产成人永久免费网站| 欧美日韩一区二区免费视频| 91九色蝌蚪国产| 亚洲已满18点击进入在线看片| 91精品美女在线| 日韩欧美主播在线| 国模精品视频一区二区| 啪一啪鲁一鲁2019在线视频| 97在线看免费观看视频在线观看| 亚洲欧美日韩另类| 亚洲一二三在线| 亚洲成人久久一区| 亚洲精品99久久久久| 777午夜精品福利在线观看| 日本高清+成人网在线观看| 九九精品视频在线观看| 久久久久一本一区二区青青蜜月| 国产午夜精品美女视频明星a级| 国产一区二区三区毛片| 亚洲国产成人久久综合| 精品久久久一区二区| 欧美—级高清免费播放| 色悠久久久久综合先锋影音下载| 久久久久亚洲精品成人网小说| 亚洲丝袜一区在线| 国产97在线观看| 精品视频在线播放| 欧美二区在线播放| 日韩电影在线观看免费| 国产精品天天狠天天看| 最近2019中文字幕一页二页| 中文精品99久久国产香蕉| 久久精品免费播放| 91久久国产婷婷一区二区| 91精品视频在线|