案例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个合约IMyContract1
,IMyContract2
,...,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);
}