Я парень, который попросил Кейна (нашего ТАКОГО лакея!) Задать оригинальный вопрос. Я подумал, что наконец-то создам аккаунт и опубликую наши выводы / результаты / опыт в отношении ответа, опубликованного Ааронаутом (так что любая заслуга ему выше).
Мы попытались добавить пользовательское поведение, как было предложено выше, и настроить его поведение для элемента конфигурации конечной точки. Мы не могли заставить код запускаться вообще, так что в итоге мы выбрали программный подход.
Поскольку у нас был настроен класс-оболочка для создания объекта ClientBase, мы использовали наши существующие функции создания, чтобы добавить поведение после сборки всех остальных частей ClientBase.
При этом мы столкнулись с несколькими проблемами, а именно с тем, что поведение ClientCredentials уже определялось для нашей ClientBase, аутентифицирующейся с помощью имени пользователя и пароля, а не нашего сертификата + имя пользователя и пароль. Поэтому мы удалили существующее поведение программным способом, прежде чем добавить наше новое поведение на основе сертификатов (с введенными именем пользователя и паролем) в качестве временной меры для тестирования. По-прежнему без излишеств, наше поведение строилось, и ApplyClientBehavior запускался, но служба все еще падала, когда вызывался Invoke (мы никогда не получали реального исключения из-за множества операторов использования, которые было трудно реорганизовать).
Затем мы решили вместо удаления существующего поведения ClientCredentials, что мы просто вставим в него наш сертификат, прежде чем позволить всей партии работать как обычно. Третий раз очарование, и теперь все работает.
Я хотел бы поблагодарить Ааронаута (и я бы проголосовал, если бы мог!) За то, что он поставил нас на правильный путь и дал хорошо продуманный и полезный ответ.
Вот небольшой фрагмент кода, который запускается и работает (с использованием тестового файла .CRT).
protected override ClientBase<TChannel> CreateClientBase(string endpointConfigurationName)
{
ClientBase<TChannel> clientBase = new ClientBase<TChannel>(endpointConfigurationName); // Construct yours however you want here
// ...
ClientCredentials credentials = clientBase.Endpoint.Behaviors.Find<ClientCredentials>();
X509Certificate2 certificate = new X509Certificate2();
byte[] rawCertificateData = File.ReadAllBytes(@"C:\Path\To\YourCert.crt");
certificate.Import(rawCertificateData);
credentials.ClientCertificate.Certificate = certificate;
return clientBase;
}
В качестве еще одного примечания: в ходе тестирования мы удалили все наши сертификаты из локального хранилища компьютеров, это фактически вызвало проблему с использованием Fiddler. Fiddler не обнаружил наш клиентский сертификат, потому что он был просто в памяти, а не в доверенном хранилище. Если мы добавим его обратно в доверенное хранилище, Fiddler снова начнет играть хорошо.
Еще раз спасибо.