Инициализация времени выполнения прокси WCF и влияние на производительность - PullRequest
0 голосов
/ 27 сентября 2011

Я инициализирую свой прокси-сервер вручную через класс ChannelFactory, поскольку конфигурации для инициализации этого прокси-сервера получены из какой-то другой службы конфигурации (не в том же App.Config) и чтобы избежать затрат на инициализацию (вызов службы, чтение параметров конфигурации), я кешировал этопрокси.Я не могу заплатить за закрытие этого прокси после каждой операции, потому что требуется частое выполнение операций.Конфигурации тайм-аута для этого прокси-сервера выглядят следующим образом.

receiveTimeout="00:10:00" 
sendTimeout="00:10:00" 
closeTimeout="00:10:00"

В соответствии с моим пониманием свойств тайм-аута на стороне клиента, состояние моего прокси-сервера будет Сбой при превышении тайм-аута.право?

Я хочу переинициализировать мой прокси, поэтому у меня есть 2 варианта сделать это.

1) Я использую обработчик события ICommunicationObject.Faults, и когда мой прокси перешел в сбойное состояние, в этом даже я повторно инициализируюпрокси.Но эта реализация не подходит, потому что мы неправильно распределили прокси (вызывая метод .Close ()), и она не освободит ресурсы со стороны службы и не повлияет на мою производительность.

2) Я создаю потоки установите истекшее время за несколько секунд до того, как прокси перейдет в состояние Faults.Закройте этот прокси должным образом, вызвав метод .Close {), переинициализируйте другой объект и кешируйте его.

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

Заранее спасибо.

1 Ответ

0 голосов
/ 28 сентября 2011

если прокси находится в неисправном состоянии, вы можете вызвать 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()
...