[Вопрос кажется немного длинным, но, пожалуйста, наберитесь терпения. У него есть пример источника, чтобы объяснить проблему.]
Рассмотрим следующий код, который по сути является хостом WCF:
[ServiceContract (Namespace = "http://www.mightycalc.com")]
interface ICalculator
{
[OperationContract]
int Add (int aNum1, int aNum2);
}
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)]
class Calculator: ICalculator
{
public int Add (int aNum1, int aNum2) {
Thread.Sleep (2000); //Simulate a lengthy operation
return aNum1 + aNum2;
}
}
class Program
{
static void Main (string[] args) {
try {
using (var serviceHost = new ServiceHost (typeof (Calculator))) {
var httpBinding = new BasicHttpBinding (BasicHttpSecurityMode.None);
serviceHost.AddServiceEndpoint (typeof (ICalculator), httpBinding, "http://172.16.9.191:2221/calc");
serviceHost.Open ();
Console.WriteLine ("Service is running. ENJOY!!!");
Console.WriteLine ("Type 'stop' and hit enter to stop the service.");
Console.ReadLine ();
if (serviceHost.State == CommunicationState.Opened)
serviceHost.Close ();
}
}
catch (Exception e) {
Console.WriteLine (e);
Console.ReadLine ();
}
}
}
Также клиентская программа WCF:
class Program
{
static int COUNT = 0;
static Timer timer = null;
static void Main (string[] args) {
var threads = new Thread[10];
for (int i = 0; i < threads.Length; i++) {
threads[i] = new Thread (Calculate);
threads[i].Start (null);
}
timer = new Timer (o => Console.WriteLine ("Count: {0}", COUNT), null, 1000, 1000);
Console.ReadLine ();
timer.Dispose ();
}
static void Calculate (object state)
{
var c = new CalculatorClient ("BasicHttpBinding_ICalculator");
c.Open ();
while (true) {
try {
var sum = c.Add (2, 3);
Interlocked.Increment (ref COUNT);
}
catch (Exception ex) {
Console.WriteLine ("Error on thread {0}: {1}", Thread.CurrentThread.Name, ex.GetType ());
break;
}
}
c.Close ();
}
}
По сути, я создаю 10 прокси-клиентов, а затем неоднократно вызываю метод Add service в отдельных потоках. Теперь, если я запускаю оба приложения и наблюдаю открытые TCP-соединения с помощью netstat, я нахожу, что:
- Если клиент и сервер работают на одном компьютере, количество соединений tcp равно количеству прокси-объектов. Это означает, что все запросы обслуживаются параллельно. Что хорошо.
- Если я запускаю сервер на отдельном компьютере, я заметил, что открыты максимум 2 TCP-соединения независимо от количества создаваемых прокси-объектов. Только 2 запроса выполняются параллельно. Это сильно ухудшает скорость обработки.
- Если я переключаюсь на привязку net.tcp, все работает нормально (отдельное TCP-соединение для каждого прокси-объекта, даже если они работают на разных машинах).
Я очень запутался и не могу заставить базовый HttpBinding использовать больше TCP-соединений. Я знаю, что это длинный вопрос, но, пожалуйста, помогите!