Я только что прочитал это отличная статья о кэшировании WCF ChannelFactory от Венлун Донга.
Мой вопрос просто в том, как вы действительно можете доказать, что ChannelFactory на самом деле кэшируется между вызовами? Я соблюдал правила, касающиеся конструкторов ClientBase. Мы используем следующий перегруженный конструктор для нашего объекта, который наследуется от ClientBase:
ClientBase (строка endpointConfigurationName, EndpointAddress remoteAddress);
В упомянутой выше статье говорится, что:
Для этих конструкторов все аргументы (включая аргументы по умолчанию) находятся в следующем списке:
· InstanceContext callbackInstance
· Строка endpointConfigurationName
· EndpointAddress remoteAddress
Пока эти три аргумента одинаковы при построении ClientBase, мы можем с уверенностью предположить, что можно использовать одну и ту же ChannelFactory. К счастью, типы String и EndpointAddress неизменяемы, т.е. мы можем провести простое сравнение, чтобы определить, совпадают ли два аргумента. Для InstanceContext мы можем использовать сравнение ссылок на объекты. Таким образом, тип EndpointTrait используется как ключ кеш-памяти MRU.
Чтобы проверить теорию кеширования ChannelFactory, мы проверяем хэш-код в конструкторе ClientBase, например. var testHash = RuntimeHelpers.GetHashCode (base.ChannelFactory);
Хеш-значение различается между вызовами, что заставляет нас думать, что ChannelFactory на самом деле не кэшируется.
Есть предположения?
С Уважением
Майлз