Вопрос о производительности WCF - PullRequest
2 голосов
/ 13 мая 2011

Я довольно новичок в WCF и у меня вопрос производительности.У меня есть следующий код, который выполняется на клиенте:

    try
    {
      for (int i = 0; i < 20; i++)
      {
         stopwatch.Reset();
         stopwatch.Start();

         var psn = client.GetPsnByPsnId(21);
         var psnList = client.GetPsnBySmartBizClientId(2);
         var container = client.GetContainerByContainerId(3);
         var containerList = client.GetContainerBySmartBizClientId(2);

         stopwatch.Stop();
         Console.WriteLine(string.Format("Pass # {0} completed in {1} milliseconds", i + 1,stopwatch.ElapsedMilliseconds));
     }
   }
   catch (FaultException exception)
   {
      MessageBox.Show(string.Format("Error occurred. The error message is {0}", exception.Message));
   }
   finally
   {
      client.Close();
      client = null;
   }

Этот код попадает в службу WCF, которая размещается как служба Windows с использованием HTTP-привязки в .NET 4.0.Проблема у меня заключается в следующем.В самый первый раз в цикле, при самом первом вызове WCF (client.GetPsnByPsnID ()), существует очень значительная задержка, фактически более 10 секунд.Но после этого первого вызова каждый последующий вызов, каждый раз проходящий через цикл, занимает <1 секунду, как я и ожидал.Я уверен, что это проблема WCF, потому что, если я вызываю первый метод вне WCF, я получаю <1 секунду производительности. </p>

Кто-нибудь знает, что может быть причиной начальной задержки?

РЕДАКТИРОВАТЬ: вот код OnStart для службы Windows:

protected override void OnStart(string[] args)
{
   serviceHost = new ServiceHost(typeof(ServiceMethods),new Uri("http://111.111.111.111:1111/Psn"));

   // Add an endpoint and the methods the endpoint will support.
   serviceHost.AddServiceEndpoint(typeof(IServiceMethods), WcfConfiguration.GenerateBinding(Enumerations.WcfBindingType.HTTP), "");

   WcfConfiguration.CreateMexData(serviceHost);
   serviceHost.Open();
}

А вот метод GenerateBinding:

public static System.ServiceModel.Channels.Binding GenerateBinding(Enumerations.WcfBindingType bindingType)
{
   System.ServiceModel.Channels.Binding binding = null;

   BasicHttpBinding httpBinding = new BasicHttpBinding();
   httpBinding.Security.Mode = ((bindingType == Enumerations.WcfBindingType.HTTP) ? BasicHttpSecurityMode.None : BasicHttpSecurityMode.Transport);
   httpBinding.OpenTimeout = new TimeSpan(0, 0, 30);
   httpBinding.SendTimeout = new TimeSpan(0, 0, 30);
   httpBinding.ReceiveTimeout = new TimeSpan(0, 0, 30);
   httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
   httpBinding.ReaderQuotas.MaxStringContentLength = httpBinding.ReaderQuotas.MaxStringContentLength;
   httpBinding.MaxReceivedMessageSize = httpBinding.MaxReceivedMessageSize;
   httpBinding.ReaderQuotas.MaxArrayLength = 1048576;
   httpBinding.MaxBufferSize = httpBinding.MaxBufferSize;

   binding = httpBinding;
   break;
   }
   return binding;
}

public static void CreateMexData(ServiceHost host)
{
  ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();

  behavior.HttpGetEnabled = true;
  host.Description.Behaviors.Add(behavior);
  host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
}

1 Ответ

0 голосов
/ 13 мая 2011

Если служба не получает никаких попаданий между вашими тестовыми прогонами, она может фактически завершать работу приложения-службы WCF, и при поступлении нового запроса он полностью перезапускает приложение, что также занимает больше времени. Это можно изменить в настройках IIS (при условии, что вы размещаете в IIS), чтобы рабочие процессы либо дольше останавливались, либо вообще не выключались.

Кроме того, WCF устанавливает соединение TCP / Http при первом вызове, последующие вызовы, вероятно, используют соединения из пула. Отсутствие необходимости восстановления соединения TCP / Http экономит ваше время.

Наконец, в текущей реализации, в лучшем случае, вы по-прежнему выполняете 4 обращения к серверу за одну итерацию. Вам, вероятно, будет лучше обслужить пакетирование ваших вызовов wcf вместе , чтобы уменьшить количество обращений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...