《ASP.NET Core跨平台开发从入门到实战》样章节 Web API自定义格式化protobuf。

样章

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。

它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

以下将实现一个格式化程序返回protobuf 格式。

首先新建一个ASP.NET Core Web Application应用程序名为 ProtobufFormat,选择Web API模板。

添加protobuf-net 引用。使用NuGet 命令行或者NuGet包管理器安装。

NuGet 命令行:Install-Package protobuf-net。

添加一个ProtobufFormatter 类

public class ProtobufFormatter : OutputFormatter

{

public string ContentType { get; private set; }

public ProtobufFormatter()

{

ContentType = "application/proto";

SupportedMediaTypes.Add(Microsoft.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/proto"));

}

public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)

{

if (context == null)

{

throw new ArgumentNullException(nameof(context));

}

var response = context.HttpContext.Response;

Serializer.Serialize(response.Body, context.Object);

return Task.FromResult(0);

}

}

继承OutputFormatter ,然后实现WriteResponseBodyAsync 方法,初始化时赋值ContentType 以及添加支持MediaType。

在WriteResponseBodyAsync 方法中获取Response,调用protobuf-net的Serialize方法将Object序列化至输出内容。protobuf 在序列化时必须指定顺序,不然会序列化失败。

下面添加一个User类,来实现protobuf 实体。

[ProtoContract]

public class User

{

[ProtoMember(1)]

public int Id { get; set; }

[ProtoMember(2)]

public string Name { get; set; }

[ProtoMember(3)]

public int Age { get; set; }

}

类上需要加上ProtoContract 特性,然后字段需加上ProtoMember特性,并指定顺序。这样的一个类才能被序列化为protobuf 格式。

然后更改ValuesController控制器里的操作,使之输出protobuf。

[Route("api/[controller]")]

public class ValuesController : Controller

{

private IEnumerable<User> Users;

public ValuesController()

{

Users= new User[] {

new User() { Id=1,Name="book",Age=1},

new User() { Id=2,Name="asp.net core",Age=10},

};

}

// GET api/values

[HttpGet]

[Produces("application/proto")]

public IEnumerable<User> Get()

{

return Users;

}

// GET api/values/5

[HttpGet("{id}")]

[Produces("application/proto")]

public User Get(int id)

{

return Users.FirstOrDefault(r => r.Id == id);

}

}

在每个操作上加上Produces特性,里面值为application/proto,也就是刚刚设置的 ContentType。然后直接返回对应的对象结果即可。

如果现在运行应用程序,访问api/values 会发现没有返回结果,因为还需要在AddMvc中添加对应的格式化。

打开Startup 类中的ConfigureServices方法,将services.AddMvc() 更改为如下:

public void ConfigureServices(IServiceCollection services)

{

services.AddMvc(option=> {

option.OutputFormatters.Add(new ProtobufFormatter());

});

}

添加输出格式化程序ProtobufFormatter。

现在再运行应用程序,访问api/values 会返回一个二进制文件,里面也就包含序列化之后的数据。

可以新建测试程序来模拟调用Web API来检查序列化是否正确。

新建一个.NET Core控制台应用程序,在Program.cs 中将Main方法更改为如下代码:

public static void Main(string[] args)

{

HttpClient client = new HttpClient();

var stream=client.GetStreamAsync("http://localhost:5000/api/values").Result;

var users=Serializer.Deserialize<List<User>>(stream);

foreach (var item in users)

{

Console.WriteLine($"ID:{item.Id}-Name:{item.Name}-Age:{item.Age}");

}

Console.ReadKey();

}

并将User类复制到该项目。

代码为访问http://localhost:5000/api/values获得结果,然后将其反序列化为实体对象。遍历对象,并展示出来。

首先运行Web API 应用程序,然后运行测试控制台应用程序。控制台应用程序会显示如下:

ID:1-Name:book-Age:1

ID:2-Name:asp.net core-Age:10

表示成功访问并得到结果反序列化实体对象成功。如此,自定义格式化程序ProtobufFormatter,也就成功实现。同理还可以实现其他所需要的格式化程序。

感悟

《ASP.NET Core跨平台开发从入门到实战》 成功出版,经历时间还是蛮长的。本书是基于.NET Core 1.0所著。

.NET Core发展快速,现在新的VS2017也发布了,导致书中部分内容可能不大适用。但是理论部分及代码还是未过时。

本书的定位为 入门书籍 ,想系统了解ASP.NET Core 及学习ASP.NET Core 有所帮助。

可以点击文章底部或左边的购买链接查看详细的目录和购买。

活动

赠书活动,本次赠送6本《ASP.NET Core跨平台开发从入门到实战》。

活动规则:

在下方评论或转发至微博并在下方评论留言。

中奖楼层规则:

截止 4月21日 12:00 楼层数-(楼层数/6-1) 递减下去。 如:最终50层 50-(50/6-1)=43 43-7=36 36-7=29 29-7=22 22-7=15 15-7=8

每人最多评论三次,超过属于刷屏,顺延至下一位。

4月21日 13:00 公布 公布中奖以后,大家将地址和联系方式私信于我。

4月21日 12:30 更新

152-(152/6-1)=128 @sigmud
128-24=104 @IT胡小帅
104-24=80 顺延至下一位 81 @张君度
80-24=56 @麦梗上的代码
56-24=32 @wlf921
32-24=8 @。流年。 
恭喜以上博友获得 《ASP.NET Core跨平台开发从入门到实战》一本。
感谢大家的热情支持,以上朋友请将地址和联系方式尽快私信于我,我会在这周末发出。

如果你觉得本文对你有帮助,请点击“推荐”,谢谢。

《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf的更多相关文章

  1. asp.net core跨平台开发从入门到实战文摘

    第1章 .NET Core 第2章 dotnet命令 第3章 VS Code安装及介绍 第4章 VS2015开发.NET Core 第5章 ASP.NET Core 第6章 EF Core 第7章 A ...

  2. [转]【翻译】在Visual Studio中使用Asp.Net Core MVC创建你的第一个Web API应用(一)

    本文转自:https://www.cnblogs.com/inday/p/6288707.html HTTP is not just for serving up web pages. It’s al ...

  3. 【翻译】在Visual Studio中使用Asp.Net Core MVC创建你的第一个Web API应用(一)

    HTTP is not just for serving up web pages. It's also a powerful platform for building APIs that expo ...

  4. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(二)-- Web Api Demo

    在上一篇里,我已经建立了一个简单的Web-Demo应用程序.这一篇将记录将此Demo程序改造成一个Web Api应用程序. 一.添加ASP.NET Core MVC包 1. 在project.json ...

  5. ASP.NET Core WebAPI 开发-新建WebAPI项目 转

    转 http://www.cnblogs.com/linezero/p/5497472.html ASP.NET Core WebAPI 开发-新建WebAPI项目   ASP.NET Core We ...

  6. 《ASP.NET Core应用开发入门教程》与《ASP.NET Core 应用开发项目实战》正式出版

    “全书之写印,实系初稿.有时公私琐务猬集,每写一句,三搁其笔:有时兴会淋漓,走笔疾书,絮絮不休:有时意趣萧索,执笔木坐,草草而止.每写一段,自助覆阅,辄摇其首,觉有大不妥者,即贴补重书,故剪刀浆糊乃不 ...

  7. 《ASP.NET Core项目开发实战入门》带你走进ASP.NET Core开发

    <ASP.NET Core项目开发实战入门>从基础到实际项目开发部署带你走进ASP.NET Core开发. ASP.NET Core项目开发实战入门是基于ASP.NET Core 3.1 ...

  8. 在Azure Container Service创建Kubernetes(k8s)群集运行ASP.NET Core跨平台应用程序

    引子 在此前的一篇文章中,我介绍了如何在本地docker环境中运行ASP.NET Core跨平台应用程序(http://www.cnblogs.com/chenxizhang/p/7148657.ht ...

  9. ASP.Net Core 2.2 MVC入门到基本使用系列 (一)

    本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...

随机推荐

  1. 663. Equal Tree Partition 能否把树均分为求和相等的两半

    [抄题]: Given a binary tree with n nodes, your task is to check if it's possible to partition the tree ...

  2. Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存问题(转)

    原文地址:https://wzfou.com/php-fpm/ 最近发现博客的内存老是隔三差五地被“吃掉”了,登录到后台后偶尔会出卡顿的情况,一开始怀疑是Swap不够导致的,于是给VPS主机增加了几个 ...

  3. pip 国内源 配置

    pip 国内源 配置 2017年12月09日 16:05:20 阅读数:183 最近使用 pip 安装包,动辄十几 k 甚至几 k 的下载速度,确实让人安装的时候心情十分不好.所以还是要给 pip 换 ...

  4. PowerShell 脚本中调用密文密码

    1. 把密码转变为加密的字符串.使用命令 ConvertFrom-SecureString Read-Host "Enter Password" -AsSecureString | ...

  5. 地址重写 No input file specified的解决方法

    转载自:http://blog.csdn.net/williamsblog/article/details/37532737 (一)IIS Noinput file specified 方法一:改PH ...

  6. 家庭家长本-微信小程序

    寒假在家的时候,做了一个简单的网页版家庭账本,后来自己学习了微信小程序的制作方法,现在想做一个微信小程序的家庭记账本. 首先要在微信公众平台注册一个微信小程序的账号,用的邮箱一个只能注册一个微信小程序 ...

  7. centos6.9 编译安装 zabbix-3.0.15

    本文采用编译安装,请在zabbix官网下载所需版本.此处安装版本是:zabbix-3.0.15.tar.gz 操作系统:centos 6.9 一.安装mysqlmysql-community-libs ...

  8. jquery print属性设置

    一,需求背景 项目中遇到打印功能,想实现完美的打印功能,对元素进行操作等,可以使用jquery print 插件. 二,依赖文件  git地址请戳这里 1,jquery 2,jquery.print- ...

  9. MySQL 三 通过yum源安装指定版本的mariadb

      1.yum源安装指定的版本     1)准备工作     下载安装当前次新版 https://downloads.mariadb.org/   选择rpm包,点击Repository Config ...

  10. Reading | 《TensorFlow:实战Google深度学习框架》

    目录 三.TensorFlow入门 1. TensorFlow计算模型--计算图 I. 计算图的概念 II. 计算图的使用 2.TensorFlow数据类型--张量 I. 张量的概念 II. 张量的使 ...