Клиент WCF - когда клиент должен закрыть канал - PullRequest
2 голосов
/ 19 ноября 2010

В типичном клиент-сервисном приложении, где сервисом является WCF, как использовать ссылку на сервис?

Например, вы создаете экземпляр сервиса для каждого вызова отдельно или открываете его и сохраняете его на протяжении всего жизненного цикла клиентского приложения? (когда я обращаюсь к 'установке службы', я имею в виду создание экземпляра объекта службы, созданного svcutil)

На данный момент мы использовали один экземпляр службы на клиенте, потому что это казалось быстрее, чем всегда, создавая, открывая и закрывая службу для каждого вызова, но теперь я хочу узнать, все ли в порядке? Основная проблема, с которой мы сталкиваемся при таком подходе, состоит в том, что происходят тайм-ауты (или мы должны иметь сеансы, открытые в течение 10 часов), разрывы соединения и т. Д., И мы всегда должны делать IsAlive через канал, чтобы убедиться, что все в порядке ... 1005 *

Если это имеет какое-либо значение, приложение является однопоточным, и аутентификация выполняется специально (путем вставки токенов авторизации в заголовок). Привязка - basicHttp (или ws, для этого случая не имеет значения).

1 Ответ

1 голос
/ 14 января 2011

Лично я предпочитаю держать канал открытым до тех пор, пока не вернется вызов метода, а затем закрыть его для свободных ресурсов.Это самый чистый подход из всех.Инициализация экземпляра прокси-сервера каждый раз занимает миллисекунды и никогда не влияет на мои цели производительности.

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

Если сохранение миллисекунд является критически важным, то у вас также может быть пул ServiceClients, из которого можно получить экземпляры.

Однако первый подход - самый чистый.Сложность плохая.

...