protobuff 是谷歌开发的,在性能上要比Json xml好很多,对性能要求比较高的时候这个是一个不错的选择,但是这个目前只是一个序列化反序列化的东西,以前原生的只有几种语言的现在在github 上有多种语言有需要的可以自行查看。

这里将protobuff集成进去,可以自己写一个格式化的也可以安装第三方包。如果是自己写继承MediaTypeFormatter,这里我用的是第三方的包大致说下怎么用。先安装WebApiContrib.Formatting.ProtoBuf 在包管理器里面,然后在WebApiConfig里注册我这里代码是这样的

  config.Formatters.Insert(, new ProtoBufFormatter());

这个是更改了序列化方式,也可以设置指定的类型这时候代码如下

ProtoBufFormatter.Model.Add(typeof (Item), true);
ProtoBufFormatter.Model.CompileInPlace();

然后新增一个实体Contact这里代码如下:

    [ProtoContract]
public class Contact { [ProtoMember()]
public int Id { get; set; } [ProtoMember()]
public string FirstName { get; set; } [ProtoMember()]
public string LastName { get; set; } [ProtoMember()]
public string Address { get; set; } }

新建一个Controller 这里是restfull风格的

 

 public class TestController : ApiController
{
public IEnumerable<Contact> Get()
{
var list = new List<Contact>
{
new Contact() { Id=,FirstName="t",LastName="l",Address="front.ltd"}, };
list.Add(new Contact() { Id = , FirstName = "x", LastName = "a", Address = "front.ltd" });
list.Add(new Contact() { Id = , FirstName = "d", LastName = "x", Address = "front.ltd" });
return list;
} // POST api/<controller>
public void Post([FromBody]Contact value)
{
Console.WriteLine("---");
Console.WriteLine(value.ToString());
Debug.WriteLine("has receive the data");
Debug.WriteLine(value);
} // PUT api/<controller>/5
public void Put(int id, [FromBody]string value)
{
} // DELETE api/<controller>/5
public void Delete(int id)
{
}

这个时候可以通过客户端访问了 这时候的客户端是这个样子的

  Debug.WriteLine("start");
var serviceUri = new Uri("http://localhost:12706/api/");
var client = new HttpClient { BaseAddress = new Uri("http://localhost:12706/api/Test/") };
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-protobuf"));
var response = client.GetAsync("Test/").Result; var r = response.Content.ReadAsStreamAsync();
if (r.IsCompleted)
{
var con=DeSerialize<List<Contact>>(r.Result); con.ForEach(model =>
{ Console.WriteLine($"the first name is {model.FirstName } the address:{model.Address}");
});

我这里是在控制台里运行的,也可以在js以及其他程序里去访问,网上这种文章不少就不在这里说了。刚才是获取如果是要post 代码是这样的

 var contractModel = new Contact();
contractModel.FirstName = "xiao";
contractModel.Address = "front.ltd";
var contentRequest = new StringContent(Serialize<Contact>(contractModel));
contentRequest.Headers.ContentType = new MediaTypeHeaderValue("application/x-protobuf");
Debug.WriteLine(contentRequest);
var res = client.PostAsync("Test/", contentRequest);
if (res.IsCompleted)
{
Console.WriteLine(res.Result);
}

这个就是整个过程了,如果有谁需要这个demo 可以留言。在整合的时候遇到了一些问题,这个ProtoContract 标记的跟用protobuff-net的工具产生的代码不太一样,不能混用。最好新建的实体类是一式两份客户端与服务端都要使用。这里参考了其他的两个链接,因为情况不太一样导致调试还花了不少时间

相关链接:

http://www.cnblogs.com/shanyou/archive/2012/01/22/using-google-protocol-buffers-hypermedia-type-with-wcf-restful-services-a-media-type.html

http://www.strathweb.com/2013/02/asp-net-web-api-and-protocol-buffers/

asp.net WebApi and protobuff的更多相关文章

  1. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  2. ASP.NET WebApi OWIN 实现 OAuth 2.0

    OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...

  3. Asp.Net WebApi核心对象解析(上篇)

    生活需要自己慢慢去体验和思考,对于知识也是如此.匆匆忙忙的生活,让人不知道自己一天到晚都在干些什么,似乎每天都在忙,但又好似不知道自己到底在忙些什么.不过也无所谓,只要我们知道最后想要什么就行.不管怎 ...

  4. ASP.NET WebApi 文档Swagger深度优化

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明博客园蜗牛原文地址,cnblogs.com/tdws   写在前面 请原谅我这个标题党,写到了第100篇随笔,说是深度优化,其实也并没有什么深度 ...

  5. ASP.NET WebApi 文档Swagger中度优化

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws   写在前面 在后台接口开发中,接口文档是必不可少的.在复杂的业务当中和多人对接的情况下,简 ...

  6. Creating a Clean, Minimal-Footprint ASP.NET WebAPI Project with VS 2012 and ASP.NET MVC 4

    Creating a Clean, Minimal-Footprint ASP.NET WebAPI Project with VS 2012 and ASP.NET MVC 4 Building O ...

  7. ASP.NET WEBAPI 的身份验证和授权

    定义 身份验证(Authentication):确定用户是谁. 授权(Authorization):确定用户能做什么,不能做什么. 身份验证 WebApi 假定身份验证发生在宿主程序称中.对于 web ...

  8. Enable Cross-Origin Requests in Asp.Net WebApi 2[Reprint]

    Browser security prevents a web page from making AJAX requests to another domain. This restriction i ...

  9. 为Asp.net WebApi 添加跨域支持

    Nuget安装包:microsoft.aspnet.webapi.cors 原文地址:https://www.asp.net/web-api/overview/security/enabling-cr ...

随机推荐

  1. jqueryValidation使用

    jq form表单前端校验可以使用jq插件jquery-validation.js.具体的使用方法: 1.引入文件: <link rel="stylesheet" href= ...

  2. WinForm 使用 HttpUtility

    在 Visual C# 中使用 HttpUtility 是无效的,即使添加了命名空间 System.Web,是因为需要在引用中添加 System.Web.dll. 可是没有 System.Web.dl ...

  3. SQL SERVER 将表中字符串转换为数字的函数 (详询请加qq:2085920154)

    在SQL SERVER 2005中,将表中字符串转换为数字的函数共2个:1. convert(int,字段名)   例如:select convert(int,'3')2. cast(字段名 as i ...

  4. 迅雷VIP帐号获取小工具

    自己写的迅雷vip帐号获取工具,主要是熟悉一下正则表达式 下载地址: 迅雷VIP获取工具 另附vip防踢补丁,不能使用最新迅雷,我使用的是迅雷尊享版2.0.12.258,使用了一段时间,至少没被踢出来 ...

  5. 关于Spring和mybatis的整合

    Spring同Mybatis的整合 1.引入相应的jar包.(Mybatis的jar包,Spring的jar包,mybatis-spring-1.1.1.jar). 2.编写相应的包(三层的包).搭建 ...

  6. Google Chrome 调试

    [原文地址:http://www.cnblogs.com/QLeelulu/archive/2011/08/28/2156402.html ] 在Google Chrome浏览器出来之前,我一直使用F ...

  7. html 页面内锚点定位及跳转方法总结

    第一种方法,也是最简单的方法是锚点用<a>标签,在href属性中写入DIV的id.如下: <!DOCTYPE html><html><head> < ...

  8. C语言的选择和循环上机题目(部分)

    /*(1)某市不同车牌的出租车3公里的起步价和计费分别为:夏利7元/公里,3公里以外2.1元/公里:富康8元/公里,3公里以外2.4元/公里:桑塔纳9元,3公里以外2.7元/公里.编程:从键盘输入乘车 ...

  9. iOS 清除web cookies

    NSHTTPCookie *cookie; NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; ...

  10. Popup - 弹出层

    //图片类快捷弹出层 <a href="" target="_blank"> <div class="panlifang1" ...