相比json来说,好处是速度更快,带宽占用更小。其效果大致等于json+Gzip。
在webapi中使用protobuf的方法为:
引用nuget包
Install-Package protobuf-net
为DTO添加注解
[ProtoContract] public class Product { [ProtoMember(1)] public int Id { get; set; } [ProtoMember(2)] public string Name { get; set; } [ProtoMember(3)] public long Value { get; set; } }
注册MediaTypeFormatter
在WebApiConfig文件中添加黄色部分的代码
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API 配置和服务 // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); // config.Formatters.Clear(); config.Formatters.Add(new ProtoBufFormatter()); } }
调用接口
http请求报文
GET http://test.cn/webapi/api/product/123 HTTP/1.1 Host: localhost:44605 Connection: keep-alive Accept: application/x-protobuf
注意黄色的部分
httpclient请求
string url = "http://test.cn/webapi/api/product/123"; HttpClient client = new HttpClient(); HttpRequestMessage request = new HttpRequestMessage(); request.RequestUri = new Uri(url); request.Method = HttpMethod.Get; request.Headers.Add("Accept", "application/x-protobuf"); HttpResponseMessage result = client.SendAsync(request).Result; var stream = result.Content.ReadAsStreamAsync().Result; var product= Serializer.Deserialize<Product>(stream);