Проблемы экземпляра и параллелизма на стороне клиента WCF - PullRequest
0 голосов
/ 26 февраля 2011

Надеемся, что WCF имеет расширенные возможности управления экземплярами и параллелизмом на стороне службы через Throttling.

Мой сервисный клиент - приложение ASP.NET. Он использует более одной WCF службы, поэтому я создаю и параметризирую WCF клиента во время выполнения (файл конфигурации не используется).

Только адрес конечной точки является динамическим, и все службы (используемые клиентом) имеют одинаковые сигнатуры методов (один и тот же контракт).

По этой причине я ссылался на службу через Visual Studio, и она создала мой прокси-сервер службы, поэтому я просто позаботился об адресе конечной точки во время выполнения:

class MyWcfClient
{
   void DoSomething(string endpintAddress, int data)
   {
      // Create 'binding' and 'endpoint' ('endpoint' address is dynamic)
      ServiceReference.ServiceClient serviceClient = new ServiceReference.ServiceClient(binding, endpoint);
      // Parametrize 'serviceClient'
      // Call WCF method (send 'data' to appropriate endpoint)
      serviceClient.CLose();
   }
}

Поскольку клиент является приложением asp.net, каждый запрос выполняется в своем собственном рабочем потоке (вызовы методов WCF очень легкие и быстрые, поэтому поток не будет блокироваться в течение длительного времени).

Мой вопрос касается инстанцирования и параллелизма на стороне клиента.

Должен ли класс MyWcfClient быть Singleton с одним экземпляром serviceClient или это будет static класс и новый serviceClient для каждого вызова?

Должен ли я создать serviceClient (т.е. массив или список) на основе конечных точек (есть 10-100 конечных точек)?

Обратите внимание, что мои потоки asp.net не должны быть заблокированы в течение длительного времени (т. Е. Ожидание в очереди для отправки связанных с ними data через WCF)

1 Ответ

0 голосов
/ 26 февраля 2011

На стороне клиента нет регулирования, и это не нужно, потому что у вас есть клиентский код под вашим контролем, поэтому вы можете контролировать количество выполненных запросов.В этом отличие от сервиса, где без регулирования нет контроля над количеством входящих запросов, выполненных в другом месте (вне контроля сервиса).

Так что если вы хотите контролировать количество запросов, одновременно выполняемых на клиенте, вы должны создать объектпул - будет доступно только ограниченное количество классов MyWcfClient, и каждый класс всегда будет создавать новый ServiceClient.Запросы будут ждать в очереди для свободного экземпляра MyWcfClient.

Если ваша единственная проблема заключается в том, как создать экземпляры ServiceClient, тогда ответ зависит от типа привязки.

  • Сессионные привязки, такие как Net.Tcp, Net.Pipe или WsHttp с надежным сеансом или контекстом безопасности: создайте новый экземпляр для каждого отношения связи.Если ваше отношение - это просто один вызов, создайте новый экземпляр для каждого вызова.Таким образом, вы можете использовать статический класс со статическим методом и создать новый экземпляр в этом методе.
  • Безсессионные привязки, такие как BasicHttp или WebHttp: вы можете повторно использовать клиент для нескольких вызовов, но не можете закрыть клиент между последующими вызовами.Вы можете использовать массив подготовленных клиентских экземпляров.Вам все равно придется обрабатывать некоторые ошибки здесь.

Кстати.также проверьте асинхронные клиентские вызовы и как правильно закрыть клиент службы.

...