《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
《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的更多相关文章
- asp.net core跨平台开发从入门到实战文摘
第1章 .NET Core 第2章 dotnet命令 第3章 VS Code安装及介绍 第4章 VS2015开发.NET Core 第5章 ASP.NET Core 第6章 EF Core 第7章 A ...
- [转]【翻译】在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 ...
- 【翻译】在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 ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(二)-- Web Api Demo
在上一篇里,我已经建立了一个简单的Web-Demo应用程序.这一篇将记录将此Demo程序改造成一个Web Api应用程序. 一.添加ASP.NET Core MVC包 1. 在project.json ...
- ASP.NET Core WebAPI 开发-新建WebAPI项目 转
转 http://www.cnblogs.com/linezero/p/5497472.html ASP.NET Core WebAPI 开发-新建WebAPI项目 ASP.NET Core We ...
- 《ASP.NET Core应用开发入门教程》与《ASP.NET Core 应用开发项目实战》正式出版
“全书之写印,实系初稿.有时公私琐务猬集,每写一句,三搁其笔:有时兴会淋漓,走笔疾书,絮絮不休:有时意趣萧索,执笔木坐,草草而止.每写一段,自助覆阅,辄摇其首,觉有大不妥者,即贴补重书,故剪刀浆糊乃不 ...
- 《ASP.NET Core项目开发实战入门》带你走进ASP.NET Core开发
<ASP.NET Core项目开发实战入门>从基础到实际项目开发部署带你走进ASP.NET Core开发. ASP.NET Core项目开发实战入门是基于ASP.NET Core 3.1 ...
- 在Azure Container Service创建Kubernetes(k8s)群集运行ASP.NET Core跨平台应用程序
引子 在此前的一篇文章中,我介绍了如何在本地docker环境中运行ASP.NET Core跨平台应用程序(http://www.cnblogs.com/chenxizhang/p/7148657.ht ...
- ASP.Net Core 2.2 MVC入门到基本使用系列 (一)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
随机推荐
- Educational Codeforces Round 63-D(基础DP)
题目链接:https://codeforces.com/contest/1155/problem/D 题意:给定n个数,可以选择一段连续子段将其乘x,也可以不操作,求最大连续子段和. 思路:比赛时觉得 ...
- node.js中stream流中可读流和可写流的使用
node.js中的流 stream 是处理流式数据的抽象接口.node.js 提供了很多流对象,像http中的request和response,和 process.stdout 都是流的实例. 流可以 ...
- php进程(线程)通信基础--System V共享内存
PHP默认情况没有开启功能,要支持该功能在编译PHP的时候要加入下面几个选项 System V消息,--enable-sysvmsg System V信号量支持,--enable-sysvsem ...
- Linux驱动之异步OR同步,阻塞OR非阻塞概念介绍
链接:https://www.zhihu.com/question/19732473/answer/20851256 1.同步与异步同步和异步关注的是消息通信机制 (synchronous commu ...
- elk kibana查询语法
elk日志系统中kibana查询语法 单项term查询 例: 搜 Dahlen, Malone 字段field查询 field:value 例:city:Keyport, age:26 通配符 ? 匹 ...
- Django跨域(前端跨域)
前情回顾 在说今天的问题之前先来回顾一下有关Ajax的相关内容 Ajax的优缺点 AJAX使用Javascript技术向服务器发送异步请求: AJAX无须刷新整个页面: 因为服务器响应内容不再是整个页 ...
- [字符串][NOIP2012]Vigenère密码
Vigenère密码 题目描述 16世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码.Vigenère密码的加密解密算法简单易用,且破译难度比较高, ...
- JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?
本文主要记录:在JAVA中,(局部)内部类访问某个局部变量,为什么这个局部变量一定需要用final 关键字修饰? 首先,什么是局部变量?这里的局部是:在方法里面定义的变量. 因此,内部类能够访问某局部 ...
- 修改maven 本地仓库,加入阿里云
阿里云仓库服务 http://maven.aliyun.com/mvn/view maven加入阿里云服务 在maven conf文件下修改settings.xml 修改本地仓库<localR ...
- C#中Equals()和= =(等于号)区别
在这里,首先得告诉大家,在C#中,不管是 == ,还是 Equals() 我们都是可以重写的.所以,在具体选择使用两者时,还是得根据这两个方法的具体实现逻辑来选择. 值类型的比较 对于值类型来说,两者 ...