если прокси находится в неисправном состоянии, вы можете вызвать Abort.Если вы действительно хотите сохранить прокси, зависит от того, что вам нужно.Если вы собираетесь использовать Duplex-Communication или что-то подобное, это может быть хорошим советом.Если вы время от времени звоните в службу, вы можете использовать прокси-сервер только во время вызовов.
Обычно я иду и пишу себе небольшой прокси-сервер, который просто публикует события Connected и Fault.И я реализую IDisposable с помощью кода, который сначала пытается закрыть прокси-сервер и, когда генерируется CommunicationException, продолжает прерывать его.
В коде, который обрабатывает сообщение, я храню ссылку на такой прокси-объект и удаляю егона Close / Fault и откройте его, как только у меня есть ожидающая операция.Это работает довольно хорошо на стороне клиента, даже когда сеть ненадежна.В случае Duplex-Services я просто добавляю таймер, который пытается автоматически переподключиться, если соединение потеряно.
Вот небольшой фрагмент в F #, демонстрирующий, как я использую этот очень простой прокси-сервер - на самом деле это не более, чемупаковка канала и получение событий соединения - WcfHelper - это просто набор вспомогательных функций для создания адресов и привязок - в данном случае это урезанная версия для DuplexService, поэтому она наследуется от DuplexClientBase, но normal Недуплексный корпус точно такой же.
/// Duplex-proxy
type private MyProxy(handler, servicename: string, server : string, port : int) =
inherit DuplexClientBase<IWcfConnector>(handler, WcfHelper.getBinding(), WcfHelper.createEndpointAddress(servicename, server, port))
let _connectionEvent = new Event<_>()
do
base.InnerDuplexChannel.Closed.Add(fun _ -> _connectionEvent.Trigger(ConnectionState.Disconnected))
base.InnerDuplexChannel.Opened.Add(fun _ -> _connectionEvent.Trigger(ConnectionState.Connected))
base.InnerDuplexChannel.Faulted.Add(fun _ -> _connectionEvent.Trigger(ConnectionState.Disconnected))
/// sample-Operation
member i.TestCall(message) = base.Channel.TestCall(message)
interface IDisposable with
member i.Dispose() =
try
i.Close()
with
| :? CommunicationException ->
i.Abort()