国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

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

2024-07-10 12:48:48
字體:
供稿:網(wǎng)友

前言

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

由于Asp.net core 采用了全新的MiddleWare方式,因此使用protobuf序列化,只需要使用Protobuf-net修飾需要序列化的對象,并在MVC初始化的時候增加相應(yīng)的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來進(jìn)行序列化/反序列化。

測試代碼

在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          }        }      }    };  }}            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 上饶县| 杨浦区| 南乐县| 韩城市| 突泉县| 攀枝花市| 资兴市| 恩施市| 沾益县| 安仁县| 肇东市| 陕西省| 平舆县| 会东县| 耿马| 宁蒗| 望奎县| 上犹县| 武功县| 普宁市| 尉氏县| 余江县| 永福县| 安丘市| 吉林市| 沙田区| 桂平市| 嵊州市| 襄汾县| 宁晋县| 璧山县| 葫芦岛市| 杂多县| 永州市| 湖州市| 孝感市| 岳阳市| 南投县| 中宁县| 普兰县| 镇原县|