2014-02-12 10 views
0

У меня довольно устаревшая сборка, которую я использую для связи через SOAP с программным обеспечением, которое пишет моя компания. Поскольку это стоит прямо сейчас, обновление сборки не является вариантом, поэтому, пожалуйста, не предлагайте это.Использование IHeaderHandler с wcf

В предыдущих итерациях нормальный способ связи выполнялся с использованием MS Soap Toolkit 3.0 (MSSOAPLIB30). Вы бы назвали метод login() сборки, и он вернет экземпляр, полученный из IHeaderHandler, который затем будет назначен экземпляру клиента мыла. Please refer here for more information on how this worked.

Ну, я хотел бы использовать более современный подход к общению с этой веб-службой. До сих пор я мог успешно ссылаться на веб-службу с помощью wcf, однако я столкнулся с проблемами, выясняя, как свести экземпляр IHeaderHandler к тому, что может понять прокси-сервер wcf. Другими словами, я пытаюсь объединить два поколения технологий вместе. Я проверил, что использование метода, упомянутого в ссылке выше, действительно работает. Теперь просто нужно выяснить, как сделать этот экземпляр IHeaderHandler полезным.

Вот несколько примеров коды для старого подхода:

string strBasicWsdlUrl = "http://" + _strDeviceName + "/MetasysIII/WS/TimeManagement/TimeService.asmx"; 
object[] Parameters1 = new object[] { strBasicWsdlUrl, "", "", "" }; 
bool[] Parameters2 = new bool[] { true, true, true, true }; 

TSClient = Activator.CreateInstance(Type.GetTypeFromProgID("MSSOAP.SoapClient30")); 
NewLateBinding.LateGet(TSClient, null, "MSSoapInit", Parameters1, null, null, Parameters2); 

Parameters1 = new object[] { NewLateBinding.LateGet(JCISecurity, null, "HeaderHandler", new object[0], null, null, null) }; 
NewLateBinding.LateSet(TSClient, null, "HeaderHandler", Parameters1, null, null); 

Как вы можете видеть, новый экземпляр клиента мыльного инициализируются с файлом WSDL и затем HeaderHandler атрибута из экземпляра JCISecurity (который это вышеупомянутая сборка, которую я использую для аутентификации с помощью программного обеспечения), которая получена из IHeaderHandler, передается в HeaderHandler клиента soap. Затем этот процесс гарантирует, что все будущие запросы от мыльного клиента будут прикреплены к этому заголовку.

Важно также отметить, что класс прокси, созданный из WCF для моей веб-службы, имеет два интересных параметра, связанных со всеми веб-методами: EncryptedCertificate и LoginResult. Я предполагаю, что эти значения будут существовать в экземпляре IHeaderHandler, поскольку исходная документация службы не ссылается на эти два параметра. Однако я не могу проверить, что это так, потому что я еще не могу понять, как получить доступ к контенту, встроенному в экземпляр IHeaderHandler.

Как показано на рисунке, на данный момент я вижу два возможных решения: укажите способ сделать класс прокси-сервера WCF напрямую использующим экземпляр IHeaderHandler, сгенерированный с помощью сборки, или выяснить способ извлечения необходимой информации из IHeaderHandler экземпляр и использовать Message Inspectors для ручной привязки данных к заголовкам.

+0

В отличие от форумов, мы не используем «Спасибо» или «Любая помощь оценена» или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -removed-from-posts) –

ответ

1

WCF очень расширяемый. Одна из этих точек расширения является Message Inspectors:

Инспектор сообщение является объектом расширяемость, который может быть использован в клиент времени выполнения и отправки выполнения модели услуг программно или через конфигурацию и которые могут проверять и изменять сообщения после того, как они получены или прежде чем они будут отправлены.

См. Также WCF Extensibility Samples и Extending WCF.

+0

Спасибо, Джон. Моя основная проблема заключается в доступе к данным, встроенным в экземпляр IHeaderHandler. Я пытался за последние пару часов найти способ проникнуть внутрь и посмотреть, что на самом деле Если бы я мог твердо понять его роль и что именно он прикрепляет к заголовку, я мог бы подражать ему с помощью Message Inspector.Пожалуйста, см. Нижнюю часть моего обновленного сообщения для получения более подробной информации. –

+0

Я пришел к выводу, что просто невозможно перенести экземпляр IHeaderHandler на то, что может понять wcf. Я очень разочарован в Microsoft, я бы надеялся, что они справятся с миграцией немного лучше. Опять же, тот факт, что этот вопрос сейчас является вершиной моих результатов поиска Google, является достаточным доказательством того, что то, что я пытаюсь сделать, встречается довольно редко. –

+0

Вы перескакиваете несколько поколений технологий. Маловероятно, что миграция уже существовала бы на протяжении многих поколений. Была ли даже миграция между SOAP Toolkit и WSE 1.0 или .NET 1.0? Я так не думаю. –

Смежные вопросы