相比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);