2010-02-02 4 views
4

Использование VS2008, VB.NET, C#, Ф.В. 3.5WCF, канал завод, и исключение

Я потребляющее мою службу в моем клиенте

службы размещается в IIS

Client (WinForms MDI) генерируется с использованием SvcUtil с использованием/л,/г,/кт, &/н переключатели

Service и клиент оба используют 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) 

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

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

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

Есть ли способ я могу иметь обработку ошибок в одном месте, или мне нужно поставить попробовать/поймать в каждом вызове, как What is the best workaround for the WCF client `using` block issue?

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

С уважением

_Eric

+0

Для вопроса об утилизации прокси-сервер не магически удален, если вы не вызвали его на прокси-сервер. – pdiddy

+0

Как насчет канала? Я не хочу удалять прокси-сервер, пока клиент не выйдет. Он возвращается в бассейн? – Eric

ответ

2

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

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

Я согласен с «танцем обработки исключений». Я закончил использование генератора прокси-сервера для обработки исключений Exception от Codeplex. – Eric

1

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

Кажется, я частично ответил на свой вопрос, я это побежал петлю на 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.Faulted или для каждого вызова Я делаю просто обернуть его в попытке, а затем поймать тайм-аут/комм/ошибки исключения, оставляя прокси-сервер, а удаляя канал? Если в последнем случае есть способ инкапсулировать это?

С уважением

_Eric

 Смежные вопросы

  • Нет связанных вопросов^_^