为什么具有数千次操作的wcf服务需要一分钟启动?

时间:2018-10-04 20:30:28

标签: c# wcf

案例1

我有一个ServiceContract,大约有2000 OperationContract s

//Service.cs
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IMyContract
{
   [OperationContract]
   void Method1(...);
   ...
   [OperationContract]
   void Method1800(...);
}

当我启动该服务时,大约需要40秒才能启动

//Program.cs
using(var serviceHost = new ServiceHost(typeof(MyService)))
{
    var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
    serviceHost.AddServiceEndpoint(typeof(IMyContract), binding, address);

    serviceHost.Open();  
    Console.ReadLine();                      
}

案例2

当我将IMyContract分成6个合约IMyContract1IMyContract2,...,IMyContract6时,每个合约最多有500个OperationContract,则服务大约需要6秒钟才能启动

//Service.cs
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class MyService: IMyContract1, ..., IMyContract6
{
       ...
}

//Program.cs
using (var serviceHost = new ServiceHost(typeof(MyService)))
{
    var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);

    serviceHost.AddServiceEndpoint(typeof(IMyContract1), binding, address);
    ...
    serviceHost.AddServiceEndpoint(typeof(IMyContract6), binding, address);

    serviceHost.Open();
    Console.ReadLine();
}

案例3

当我为每个合同创建单独的服务并为每个合同启动ServiceHost时,该服务将在1-2秒内启动。

//Service.cs
public class MyService1 : IMyContract1 {...}
...
public class MyService6 : IMyContract6 {...}

//Program.cs
var hosts = new List<ServiceHost>();
var eps = new List<Tuple<Type, Type, string>>
{
    new Tuple<Type, Type, string>(typeof(MyService1), typeof(IMyContract1), address+"1"),
    ...
    new Tuple<Type, Type, string>(typeof(MyService6), typeof(IMyContract6), address+"6"),
};

for (int i = 0; i < eps.Count; i++)
{
    var serviceHost = new ServiceHost(eps[i].Item1);
    {
        var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);

        serviceHost.AddServiceEndpoint(eps[i].Item2, binding, eps[i].Item3);

        serviceHost.Open(); 
        Console.ReadLine(); 
    }
    hosts.Add(serviceHost);
}

0 个答案:

没有答案