в

Kazan Dev Alliance

Казанское Сообщество Разработчиков Программного Обеспечения

Персональный блог Зильберга Игоря

Персональный блог Зильберга Игоря (участник сообщества, генеральный директор SmartHead, LTD).

Delphi-клиент, .NET Web-Service и великий и могучий :)

Совсем недавно для одного из наших заказчиков было необходимо реализовать интеграцию каталога сайта с самописной (на Delphi) складской системой…

Казалось бы проблем никаких - сайт написан на ASP.NET 2.0, БД на SQL Server 2005, зная, что в Delphi 7 уже реализована поддержка SOAP веб-служб, решили просто написать веб-службу, интегрированную с базой данных сайта и через нее осуществить интеграцию со складской системой.

Задача как и предполагалось оказалась довольно простой. В Delphi 7 есть мастер WSDL Importer, который с легкостью сгенерировал прокси для нашей службы. Но при попытке использовать этот прокси и обратиться к веб-службе мы столкнулись с интересной проблемой: при передаче из Delphi -клиента в веб-сервис сообщения, содержащего русские символы в веб-сервис они приходили в виде знаков вопроса.

Пытались перекодировать все и вся:) Результатов - ноль. Гугл ничего, кроме тривиальных советов изменить кодировку в секции <globalization/> в конфиг-файле не дает.

Решение, как всегда, оказалось на поверхности. Сравнивая запросы стандартного .NET-клиента и Delphi-клиента с помощью SoapExtentions обнаружили, что первый передает HTTP-заголовок "Content-Encoding: text/xml, charset=utf8", а второй - "Content-Encoding: text/xml". Именно тут-то собака и порылась:)

Как оказалось, проблема решается добавлением строки RIO.HTTPWebNode.UseUTF8InHeader := true; в функцию GetIntegrationServiceSoap, которая находится в прокси-классе, сгенерированном WSDL Importer`ом.

Комментарии

 

Raimon сказал:

Игорь, на этом ведь причуды генератора делфин не заканчиваются. Ты не упомянул о про проблему, которую я решал пару дней ;)

July 27, 2007 3:51 AM
 

AnimeManiac сказал:

Колись! )

July 27, 2007 6:36 AM
 

doctorsolberg сказал:

Уверен, Раиль, у тебя гораздо лучше получится:)

July 27, 2007 10:45 AM
 

Raimon сказал:

Была проблема, что сгенерированный Делфи прокси для вебсервиса не правильно отправлял параметры, в результате чего вебсервису приходил null в качестве значения параметра. Оказалось необходимо дописать одну строчку в сгенерированный Делфи код.

к сожалению у меня сейчас нет исходников проекта, так что думаю Игорь подскажет :):)

July 30, 2007 3:21 AM
 

doctorsolberg сказал:

Строчка:

InvRegistry.RegisterInvokeOptions(TypeInfo(IntegrationServiceSoap),

ioDocument);

Указывает тип вызываемого интерфейса, в данном случае указывает что надо использовать SOAP, по умолчанию используется XML-RPC

July 30, 2007 9:30 AM
 

AnimeManiac сказал:

Завидую. Работа у вас интересная!

July 31, 2007 3:11 AM
 

Ivan сказал:

Спасибо огромное за данный пост!

а то пришлось бы тоже пару дней убить на поиск решения :)

З.Ы.: ...подобная задача интеграции C++ Builder приложения с .Net Web сервисами

December 26, 2007 8:47 AM
 

doctorsolberg сказал:

Всегда пожалуйста!:)

December 27, 2007 2:33 AM

Оставить комментарий

(required)  
(optional)
(required)  

About doctorsolberg

Студент КГТУ (КХТИ) Факультет Управления и Автоматизации
Генеральный директор ООО "SmartHead"
© 2007 Kazan Developers Community and Post`s Authors