【问题标题】:Web Api, howto improve performance with ProtoBufWeb Api,如何使用 ProtoBuf 提高性能
【发布时间】:2014-06-07 08:59:02
【问题描述】:

在访问 Api 时,加载一大块 35 MB Json 需要将近 50 秒。因此,为了提高性能,我将 WebApiContrib.Formatting.ProtoBuf 添加到我的项目中。数据显示在 Kendo UI 网格中。

我在这里缺少什么?视图中的数据类型或类型,或类似的东西?还有其他或更好的方法来提高性能吗?

这里有一些sn-ps->

POCO级:

[ProtoContract]
    public partial class KDAuftraege
    {
        [ProtoMember(1)]
        public int AngebotsNummer { get; set; }
        [ProtoMember(2)]
        public Nullable<int> BesuchsNummer { get; set; }
        [ProtoMember(3)]
        public Nullable<int> Kennummer { get; set; }
        [ProtoMember(4)]

查看:

var remoteDataSource = new kendo.data.DataSource({
        transport: {
            read: {
                url: '/api/WebApiAuftraege'

            },
        },

控制器:

public IQueryable<KDAuftraege> GetKDAuftraeges()
    {
        //return db.KDAuftraeges.Take(500);
        return db.KDAuftraeges;
    }

WebApi:

 config.Formatters.Add(new ProtoBufFormatter());

标题:

Cache-Control   no-cache
Content-Length  36227588
Content-Type    application/json; charset=utf-8
Date    Sat, 07 Jun 2014 09:23:54 GMT
Expires -1
Pragma  no-cache
Server  Microsoft-IIS/8.0
X-AspNet-Version    4.0.30319
X-Powered-By    ASP.NET
X-SourceFiles   =?UTF-8?B?YzpcdXNlcnNcb2xkc3BvcnRcZG9jdW1lbnRzXHZpc3VhbCBzdHVkaW8gMjAxM1xQcm9qZWN0c1xWaXM0XFZpczRcYXBpXFdlYkFwaUF1ZnRyYWVnZQ==?=
Anfrage-HeaderQuelltext anzeigen
Accept  */*
Accept-Encoding gzip, deflate
Accept-Language de,en-US;q=0.7,en;q=0.3
Connection  keep-alive
Cookie  __RequestVerificationToken=wMVQWPOkXsB2XDIFN_07RJDtKqN_90dLRYaBYJGsFSGEHTcQ1S6e15mPiWrvkMHS8HrAlHYAI0OVSkqtPQHFVMP5DxoyccijSktL_KsoEFU1; .AspNet.ApplicationCookie=RTQ61CfArDWHlWN06eOpZiZY6NmFGp0SwCCuR8bQCtnItSz6S8YTasQu4-uoRQCc-XqWDCZmtOpEb-b0SyIioQPomkm1BrKywMcVwt3bF_JBxORKGg-UNSHyPvFyBohiS1sJ354LpRHIjrPIA8rUexvZih4VrK9lvHu_sm21ncNXXV7jATKAjTdX7J3XvfxRsF11fhgDNtpXPEWxQPjD7Rkj5yvdqI-vbfr9tfQbszUR1O3oOjYcRxUvvVrJ7xnt-caxt-o_Kut1dixLEA241pMGPCHfetWK73Yp148K3X9By6ylHFOTEjjDwHZyHLIrBwwOZ-ujnaOf20jQzeZXaF16bHxeadLYuKK-Z2DpdzaJXPzZd2pBbzHJMFX7USfZmp7OZzLpOitLCMovGHwdRiLD0F2NR1a0iTHCgiZLvA8
Host    localhost:19275
Referer http://localhost:19275/MvcAuftraege
User-Agent  Mozilla/5.0 (Windows NT 6.3; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0
X-Requested-With    XMLHttpRequest

【问题讨论】:

  • 您可以发布您的请求/响应的标题吗? Accept: application/x-protobuf 设置了吗?
  • 我更新了标题。我必须在哪里实际设置Accept: application/x-protobuf
  • 看起来它设置为*/* 允许服务器选择编码,我猜原始缓冲区编码是最后一个选项。可以尝试删除所有其他格式化程序 (config.Formatters.Clear();),然后添加 proto-buf 格式化程序。或者,在您的 javascript 中更改您的请求以进行设置(对不起,我不熟悉)
  • 谢谢,我试试看!
  • 您是否考虑过使用 IIS 压缩?如果您使用自托管,您还可以查看使用DelegateHandler 进行压缩。见codeproject.com/Articles/557232/…

标签: json asp.net-web-api kendo-grid protocol-buffers


【解决方案1】:

选项1:改变你的视图DataSource代码(我认为这是对的)

var remoteDataSource = new kendo.data.DataSource({
    transport: {
        read: {
            type: 'GET',
            headers: { Accept: 'application/x-protobuf' },
            url: '/api/WebApiAuftraege'
        },
    },

选项 2:更改您的 Web API 格式化程序,使 ProtoBuf 成为默认值:

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

【讨论】:

  • 对于选项 2(这并不是建议您应该使用选项 2)。而是做config.Formatters.Insert(0, new ProtoBufFormatter());
  • @Aron 我知道有办法插入.. 更新我的答案和赞成的评论。
  • 我尝试了这两个选项。只有选项 2 对我有用(根据 Aron 的建议)。现在类型已更改为application/x-protobuf,文件大小降至 10 MB。但是:加载时间仍然相同-> 50 秒。
  • @oldsport 规则第一条。先统计一下。尝试使用 fiddler 查看第一个字节开始下载需要多长时间。实际上,您可能会遇到 EF/SQL 或许多其他管道点的问题。也可能是您的 UI 需要 50 秒才能更新。
猜你喜欢
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 2021-02-22
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
相关资源
最近更新 更多