Я только что прочитал это great article на WCF ChannelFactory кэширование Wenlong Dong.WCF ChannelFactory кэширование
Мой вопрос заключается в том, как вы можете фактически доказать, что ChannelFactory фактически кэшируется между вызовами? Я соблюдал правила, касающиеся конструкторов ClientBase. Мы используем следующий перегруженный конструктор на нашем объекте, который наследуется от ClientBase:
ClientBase (конечная точка строкиConfigurationName, EndpointAddress remoteAddress);
В упомянутой выше статье утверждается, что:
Для этих конструкторов, все аргументы (в том числе по умолчанию) находятся в следующем списке:
· InstanceContext callbackInstance
· строка конечная точкаConfigurationName
· EndpointAddress remoteAddress
Пока эти три аргумента такой же, когда ClientBase является построен, можно смело предположить, что то же ChannelFactory можно использовать. К счастью, String и Типы EndpointAddress неизменяемы, i.e., мы можем сделать простое сравнение с , чтобы определить, являются ли два аргумента тем же. Для экземпляра InstanceContext мы можем использоватьсравнение ссылок на объекты. Таким образом, тип EndpointTrait имеет , используемый в качестве ключа кэш MRU.
Чтобы проверить теорию кэша ChannelFactory, мы проверяем Hashcode в конструкторе ClientBase, например. var testHash = RuntimeHelpers.GetHashCode (base.ChannelFactory);
Хеш-значение отличается от вызовов, что заставляет нас думать, что ChannelFactory не кэшируется.
Любые мысли?
С уважением
Myles
Получаете ли вы тот же результат при использовании объекта.ReferenceEquals для проверки личности? Я немного подозрительно отношусь к вызову object.GetHashCode не виртуальным способом, потому что я не знаю его деталей реализации) –
Я столкнулся с той же проблемой, когда я на самом деле использую конструктор, который утверждает, что он не будет кэшировать но время показывается иначе. Похоже, что даже конструкторы, которые его утверждают, не будут кэшировать? Как мы можем действительно знать, что ChannelFactory был кэширован? –