2

我有一个带有 2 个端点的 WCF 服务,使用在 Azure 中的一个实例上运行的 BasicHttpBinding。当第一次调用服务时,响应需要 13-16 秒(这是意料之中的),后续请求在 150 毫秒到 1000 毫秒之间就足够了,具体取决于请求类型(我正在使用 soapUI 进行测试)。

但是,如果我在几分钟内少于 4 或 5分钟)没有发送任何请求,则服务实例似乎不会被重用,因为它需要 13 秒以上的第一个请求。

我在我的 ServiceBehavior(s) 中尝试了“InstanceContextMode = InstanceContextMode.Single”,但这并没有解决问题。

在跟踪中,我可以看到只要服务响应缓慢,线程 ID 就会发生变化。

我还记录了从 Application_BeginRequest 被击中到客户端调用方法开始的时间,这似乎是这些“慢”调用期间最大的延迟。我有一些相当大的类代表业务接口,并且正在将实体框架用于在 Azure VM 上运行的 MySQL 数据库。(尽管我认为这不一定是 Azure 问题)。

无论我是调用链接到 DB 操作的复杂消息类型还是只是简单的“Hello World”响应,缓慢的响应都是一样的。

  • 即使需要一个新的服务实例,在IIS 重新启动或应用程序池回收后是否需要与初始加载一样长?

  • 使用静态类的包装器做一些魔术有帮助吗?(我认为不是)。

使用 C# 4.0 / VS2010 Professional 构建

4

1 回答 1

2

发生这种情况的原因可能有很多。我建议您从WCF 服务中的一些跟踪开始。

  • 使用TraceSource在您的应用程序中添加一些日志记录:

    private TraceSource ts = new TraceSource("MyApp");
    
    public string GetData(int value)
    {
        ts.TraceInformation("GetData called with {0}", value);
    
        return string.Format("You entered: {0}", value);
    }
    
  • 在 web.config 中配置 TraceSource 以及 System.ServiceModel 源。


 <system.diagnostics>
    <sources>
      <source name="MyApp" switchValue="All">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
      <source name="System.ServiceModel" switchValue="All" propagateActivity="true">
        <listeners>
          <add name="xml" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="Logs.svclog" type="System.Diagnostics.XmlWriterTraceListener" name="xml" />
    </sharedListeners>
    <trace autoflush="true" />
  </system.diagnostics>

  • 打开 svclog 文件,您将能够看到服务中发生的所有事情的详细概述以及每个小步骤需要多长时间。这应该可以帮助您指出问题所在。

在此处输入图像描述

于 2012-09-06T14:44:41.917 回答