WCF 服务空闲时间少于 5 分钟后响应缓慢(Azure 上的 4.0)

标签 wcf c#-4.0 azure

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

但是,如果我几分钟(少于 4 或 5 分钟)不发送任何请求,则服务实例似乎不会按原样被重用第一个请求耗时 13 秒以上。

我已在 ServiceBehavior 中尝试过“InstanceContextMode = InstanceContextMode.Single”,但这并没有解决问题。

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

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

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

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

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

使用 C# 4.0/VS2010 Professional 构建

最佳答案

发生这种情况的原因可能有很多。我建议你从一些 tracing 开始在您的 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 文件,您将能够看到服务中发生的所有情况的详细概述以及每个小步骤需要多长时间。这应该可以帮助您指出问题。

enter image description here

关于WCF 服务空闲时间少于 5 分钟后响应缓慢(Azure 上的 4.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12302203/

相关文章:

wcf - 如何为 WCF REST C# 站点设置 oAuth 身份验证

c# - [DataContract] 的命名空间

entity-framework - EF - 为什么有时是急切加载,有时是延迟加载

c#-4.0 - 使用 FieldInfo.SetValue 和 DynamicObject 作为参数 2

从 webhook 调用时,Azure WebJob 控制台应用程序参数为空

azure - 通过 URL 将 IoT 消息发送到 Azure 事件中心

c# - 调用 Restful Wcf 服务时出现 404 错误

WCF 数据服务错误 "The given name ' Foo' 未在实体集中找到”

c#-4.0 - 如何传递字符串类型的属性

azure - 如何修复azure cli中的ApplicationGatewayFirewallEnabledOverrideStateCannotBeConfiguredForApiVersion错误?