WCF, фабрика каналов и исключения - PullRequest
4 голосов
/ 02 февраля 2010

Использование vs2008, vb.net, C #, fw 3.5

Я использую мой сервис в моем клиенте

Сервис размещен в IIS

Клиент (winforms MDI) генерируется с использованием svcutil с использованием ключей / l, / r, / ct, & / n

Служба и клиент используют MyEntities.dll

Я использую nettcp с TransportWithMessageCredential Я кеширую прокси в основной форме

if  Membership.ValidateUser(UsernameTextBox.Text, PasswordTextBox.Text)
    _proxy = new MyServiceClient
    _proxy.ClientCredentials.UserName.UserName = "username"
    _proxy.ClientCredentials.UserName.Password = "password"

Затем я передаю _proxy всем дочерним формам / плагинам, которые должны его использовать. ех

List(of Orders) =  _proxy.ChannelFactory.CreateChannel.GetOrders(customer)

Все работает отлично, но мои вопросы таковы:

Что происходит с каналами после вызова? Они волшебно расположены?

Как я могу контролировать это с помощью профилировщика?

Есть ли способ, которым я могу обрабатывать ошибки в одном месте, или мне нужно размещать try / catch при каждом вызове, например Какой лучший обходной путь для клиента WCF `using` block проблема?

try
{
    ...
    client.Close();
}
catch (CommunicationException e)
{
    ...
    client.Abort();
}
catch (TimeoutException e)
{
    ...
    client.Abort();
}
catch (Exception e)
{
    ...
    client.Abort();
    throw;
}

Могу ли я подписаться на _proxy.InnerChannel.Faults и сделать это там?

Привет

_Eric

Ответы [ 2 ]

2 голосов
/ 05 февраля 2010

Я использую две разные вещи, в зависимости от варианта использования:

  • В клиентском сценарии, где я знаю, что одновременно используется только один экземпляр канала, я лениво создаю канал и повторно использую созданный экземпляр. В случае сбоя, закрытия или удаления канал воссоздается.
  • В сценариях, когда несколько каналов могут быть запрошены одновременно, я думаю, что лучше всего использовать танец обработки исключений. Чтобы избежать раздувания кода, вы можете централизовать его в метод, который принимает делегата для фактической работы, которую он проделал, чтобы он сформировал экзоскелет с однократной записью вокруг вашего кода полезной нагрузки.
1 голос
/ 03 февраля 2010

Дополнительные результаты испытаний / заметки

Кажется, я частично ответил на свой вопрос, я запустил этот цикл для 500 X

 List(of Orders) =  _proxy.ChannelFactory.CreateChannel.GetOrders(customer)

Это очень зло, и в начале 11-й итерации получена ошибка тайм-аута, что является максимальным числом пользователей моего сервиса (10). Означает ли это, что кто-то может реализовать любой клиент wcf и открыть столько каналов, сколько позволит сервер wcf?

Я обнаружил, что это дало мне ожидаемые результаты и завершил все 500 итераций

  Dim channel = _proxy.ChannelFactory.CreateChannel
     e.result = Channel.GetOrders(customer)
     Dim Ich = DirectCast(channel, ServiceModel.IClientChannel)
     Ich.Close()
     Ich.Dispose()

Мой вопрос сейчас можно ли привести casttochannel, закрыть и утилизировать внутри события _proxy.InnerChannel.Fapted или для каждого сделанного мной вызова просто обернуть его в попытку, а затем перехватить исключения тайм-аута / связи / сбоя, оставив прокси-сервером только удаление канала? Если в последнем случае есть способ инкапсулировать это?

Привет

_Eric

...