Я довольно новичок в 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");
}