asp.net WebApi and protobuff

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

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

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

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

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

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

    [ProtoContract]
    public class Contact

    {

        [ProtoMember(1)]
        public int Id { get; set; }

        [ProtoMember(2)]
        public string FirstName { get; set; }

        [ProtoMember(3)]
        public string LastName { get; set; }

        [ProtoMember(4)]
        public string Address { get; set; }

    }

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

 

 public class TestController : ApiController
    {
        public IEnumerable<Contact> Get()
        {
            var list = new List<Contact>
            {
                new Contact() { Id=123456789,FirstName="t",LastName="l",Address="front.ltd"},

            };
            list.Add(new Contact() { Id = 987654321, FirstName = "x", LastName = "a", Address = "front.ltd" });
            list.Add(new Contact() { Id = 330987260, 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/

时间: 2024-08-06 20:08:36

asp.net WebApi and protobuff的相关文章

ASP.NET WebAPI 08 Message,HttpConfiguration,DependencyResolver

Message WebAPI作为通信架构必定包含包含请求与响应两个方法上的报文,在WebAPI它们分别是HttpRequestMessage,HttpResponseMessage.对于HttpResponseMessage之前在WebAPI返回结果中有应用. HttpRequestMessage 请求报文包含请求地址(RequestUri),请求方法(Method),头信息(Headers),报文信息(Content)以及Http版本(Versions) public class HttpRe

asp.net webapi 使用小结

一星期前公司用webapi处理一些事情,自己总结一下用法. 1.创建一个空的webapi会默认有一下几个方法. public class ValueController : ApiController { // GET api/value public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } // GET api/value/5 public st

使用ASP.Net WebAPI构建REST服务(六)——Self-Host

Asp.Net WebAPI生成的是一个程序集,并不是独立的进程,因此,要运行的时候必须将其承载在相应的宿主上,一般比较常见的是IIS承载.很多时候,我们为了简化部署或者功能集成,需要将其承载到独立的进程上,这种方式一般称之为Self-Host,本文就简单的介绍一下WebAPI的SefHost方法. 首先在Nuget上安装Microsoft.AspNet.WebApi.SelfHost库. 附上我们的WebAPI控制器 publicclassValuesController : ApiContr

使用ASP.Net WebAPI构建REST服务(四)——参数绑定

默认绑定方式 WebAPI把参数分成了简单类型和复杂类型: 简单类型主要包括CLR的primitive types,(int.double.bool等),系统内置的几个strcut类型(TimeSpan.Guid等)以及string.对于简单类型的参数,默认从URI中获取. 复杂类型的数据也可以直接作为参数传入进来,系统使用media-type formatter进行解析后传给服务函数.对于复杂类型,默认从正文中获取, 例如,对于如下函数 HttpResponseMessage Put(int

Asp.net WebApi + EF 单元测试架构 DbContext一站到底

其实关于webapi和Ef service的单元测试我以前已经写过相关文章,大家可以参考: Asp.net WebAPI 单元测试 单元测试 mock EF 中DbContext 和DbSet Include 先看一下项目结构图: 这个demo非常简单,UTWebApi.Data 是纯粹的数据定义,UTWebApi.Service是我们的业务服务逻辑层,UTWebApi 是我们webapi的实现,UTWebApi.Tests就是测试项目. 数据层: BloggerDbContext的构造函数一般

使用ASP.Net WebAPI构建REST-ful 服务(一)——简单的示例

由于给予REST的Web服务非常简单易用,它越来越成为企业后端服务集成的首选方法.本文这里介绍一下如何通过微软的Asp.Net WebAPI快速构建REST-ful 服务. 首先创建一个Asp.Net Web应用程序(我这里用的是Visual Studio 2013,它已经内置了Web API2). 在出来的模板中选择Empty(空项目),并勾选WebAPI.点击确定后,就创建了一个空的WebAPI服务. 此时只有一个空项目,还没有任何功能,在进行下一步之前,首先我们来看一下REST的基本操作模

[原创] ASP.NET WEBAPI 接入微信公众平台 总结,Token验证失败解决办法

首先,请允许我说一句:shit! 因为这个问题不难,但是网上有关 ASP.NET WEBAPI的资料太少.都是PHP等等的. 我也是在看了某位大神的博客后有启发,一点点研究出来的. 来看正题! 1.微信公众平台的接入方法,无非4个参数(signature, timestamp, nonce, echostr)加1个Token(两边对应) 2.Token, timestamp, nonce字典排序后,按照字符串“SHA1”加密.得出一串字符串 tmpStr(转化为小写) 3.然后比对 tmpStr

使用ASP.Net WebAPI构建REST服务(二)——路由

REST并没有像传统的RPC服务那样显式指定了服务器函数的访问路径,而是将URL根据一定的规则映射为服务函数入口,这个规则就称之为路由.Asp.Net WebAPI的路由方式和Asp.Net MVC是相同的,它支持两种路由方式,传统的路由映射和特性路由. 路由规则WebApiConfig.cs中定义,它的默认内容如下: publicstaticclassWebApiConfig    {        publicstaticvoid Register(HttpConfiguration con

基于ASP.NET WebAPI OWIN实现Self-Host项目实战

引用 寄宿ASP.NET Web API 不一定需要IIS 的支持,我们可以采用Self Host 的方式使用任意类型的应用程序(控制台.Windows Forms 应用.WPF 应用甚至是Windows Service)作为宿主. 一.摘要 本期同样带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现采用微软的ASP.NET OWIN技术承载WebAPI服务,如果您对本期的教程内容感兴趣,那么请允许让阿笨带着大家一起学习吧! 废话不多说,直接上干货,我们不生产干货,我