WCF第一次调用慢

时间:2018-01-17 14:57:24

标签: performance wcf client

我使用Visual Studio项目创建向导从头开始创建一个WCF服务。

以下是服务的界面:

namespace ServiceTest {

[ServiceContract]
public interface IService1 {

    [OperationContract]
    string GetData(int value);

    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);

}

[DataContract]
public class CompositeType {
    bool boolValue = true;
    string stringValue = "Hello ";

    [DataMember]
    public bool BoolValue {
        get { return boolValue; }
        set { boolValue = value; }
    }

    [DataMember]
    public string StringValue {
        get { return stringValue; }
        set { stringValue = value; }
    }
}

实施:

namespace ServiceTest {
    public class Service1 : IService1 {
    public string GetData(int value) {
        return string.Format("You entered: {0}", value);
    }

    public CompositeType GetDataUsingDataContract(CompositeType composite) {
        if (composite == null) {
            throw new ArgumentNullException("composite");
        }
        if (composite.BoolValue) {
            composite.StringValue += "Suffix";
        }
        return composite;
    }
}

和Web.config:

<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.6.1"/>
    <httpRuntime targetFramework="4.6.1"/>
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"/>
    </httpModules>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="false"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <protocolMapping>
    <add binding="basicHttpsBinding" scheme="https"/>
  </protocolMapping>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="ApplicationInsightsWebTracking"/>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"
    preCondition="managedHandler"/>
    </modules>
    <directoryBrowse enabled="true"/>
    <validation validateIntegratedModeConfiguration="false"/>
  </system.webServer>
</configuration>

另一方面,客户端(一个简单的控制台应用程序)带有代码:

namespace ClientServiceTest {
class Program {
    static void Main(string[] args) {
        Service1Client client = new Service1Client();
        DateTime begin = DateTime.Now;
        string res = client.GetData(0);
        TimeSpan interval = DateTime.Now - begin;
        ;
    }
}

我的问题是: 在第一次调用时,interval.TotalMilliseconds大约为250。 如果我再次使用同一个客户端进行呼叫,我大约需要10毫秒。

如何降低初始费用?

1 个答案:

答案 0 :(得分:0)

我假设第一次调用导致应用程序池加载然后加载服务,并且第二次调用已经加载了所有内容。

在IIS管理器中,尝试将运行WCF服务的应用程序池的启动模式设置为AlwaysRunning,将空闲超时操作设置为暂停。您可能还想增加空闲超时(分钟)。