WCF -大响应需要很长时间从我的代码返回到被发送到客户端,同时有100%的CPU使用率



情况是这样的:

  • 我有一个具有双工netttcpbinding的WCF主机
  • 我有一个WCF客户端,请求一个包含字节数组(大约2MB的图像)的对象
  • 我得到这个对象(服务器端)使用实体框架从我的数据库,它是这样的东西:
    • id (int)
    • 类型(字符串)
    • 数据(字节[]约2MB)
  • 然后我将其返回给客户端(实际上到。net wcf代码,在那里它应该被序列化,然后发送到客户端),从那时起我不能调试任何进一步,我的代码似乎在服务器中返回了很好,但我的客户端一直等待15秒或更长时间,直到它从服务主机得到答复。我的cpu使用了100%的核心(由托管服务的应用程序使用),因此它忙于在我的返回和发送之间做一些事情。我确信不是发送花了这么长时间,因为我的可靠会话开始要求重传,因为它没有收到任何东西,使情况更糟……所以我关闭了可靠的会话,什么导致服务只需要回复一次我的请求:),但是15秒的2MB数据…

当我没有数据时(所以数据部分为null),它工作得很好。图像越大,需要的时间就越长……最奇怪的是,它有时会非常快(1秒左右)(但这并不经常发生,而且似乎是随机的)。这在我测试过的所有电脑上都会发生,所以我的电脑没有任何问题。

能否在本地复制?

如果是这样,我建议使用asp.net迷你分析器。我会在每个页面上使用它,即使是那些没有明显性能问题的页面。

http://code.google.com/p/mvc-mini-profiler/

我也找到了一篇很好的文章;http://www.hanselman.com/blog/NuGetPackageOfTheWeek9ASPNETMiniProfilerFromStackExchangeRocksYourWorld.aspx

所以100%的CPU在服务器端,对吗?

你可以在你的WCF代码中加入一些这样的代码,看看你是否可以缩小导致问题的代码行。

DateTime Start = DateTime.Now;
DateTime End = DateTime.Now;
TimeSpan CallTime = End - Start;
Console.WriteLine("Call Time(MS): " + CallTime.Milliseconds.ToString());

没有看到任何代码,我猜它是数据库对象的Serialize方法。您可以实现自定义序列化接口,因为您实际上只对发送byte[]感兴趣。

最新更新