Как отправить клиентские данные WCF с помощью Delphi XE

Я разработал службу WCF с пользовательским UserNamePasswordValidator с basicHttpBinding с использованием HTTPS. Он отлично работает с клиентом .Net, используя ClientCredentials для отправки имени пользователя и пароля для аутентификации.

Однако мне нужно вызвать это из клиента Delphi XE. Как отправить эквивалент .Net ClientCredentials с помощью Delphi? Это возможно? Если да, то как? Если нет, есть ли альтернативы?

Tks

ИЗМЕНИТЬ

Ниже мой код на стороне клиента в .Net:

EndpointAddress oTransac = new EndpointAddress(GetAddress());
using (WebServiceClient oClient = new WebServiceClient ("httpbasic", oTransac))
{
  oClient.ClientCredentials.UserName.UserName = "username";
  oClient.ClientCredentials.UserName.Password = "password";
  oClient.DoStuff();
}

ИЗМЕНИТЬ

Я провел некоторое исследование, и мне удалось выполнить аутентификацию между Delphi и старыми веб-службами asmx с помощью SOAP Hearders. Я нашел статью ниже. Смогу ли я добиться того же поведения старого [WebMethod] [System.Web.Services.Protocols.SoapHeader("SoapHeader")], используя технику статьи?

http://weblogs.asp.net/paolopia/archive/2008/02/25/handling-custom-soap-headers-via-wcf-behaviors.aspx

ИЗМЕНИТЬ НАГРАД

Получение помечено как правильный ответ щедрости, я хотел бы иметь возможность вызывать веб-службу из Delphi, используя службу WCF UserNamePasswordValidator на стороне сервера.


person Pascal    schedule 23.05.2011    source источник
comment
вы можете отправлять учетные данные через заголовки http, верно?   -  person Aravind    schedule 23.05.2011
comment
В Delphi - да ... но поскольку он работает по протоколу HTTPS, я не могу прочитать заголовок SOAP в сообщении с помощью Fiddler, поэтому я не знаю, что отправлять.   -  person Pascal    schedule 23.05.2011
comment
Вы знаете, как вручную форматировать заголовок SOAP в коде .Net? Если вы это сделаете, я смогу преобразовать его в Delphi. Любая помощь - это помощь! Tks   -  person Pascal    schedule 23.05.2011
comment
Взгляните на WCFextras wcfextras.codeplex.com и класс SoapHeader. msdn. microsoft.com/en-us/library/   -  person Aravind    schedule 23.05.2011
comment
Интересный. Мне пришлось бы отключить всю конфигурацию безопасности WCF по умолчанию в web.config, например TransportWithMessageCredential и UserNamePasswordValidator, и сделать это вручную, правильно, через заголовок SOAP?   -  person Pascal    schedule 23.05.2011
comment
Я не пробовал много раз. Надеюсь, там достаточно документации, чтобы помочь вам. В одном случае я просто создал плоский wsdl, чтобы java-клиент мог правильно использовать wcf.   -  person Aravind    schedule 23.05.2011


Ответы (2)


Во-первых, basicHttpBinding выполняется через HTTP (не HTTPS)

http://msdn.microsoft.com/en-us/library/ms731361.aspx

Для использования службы WFC из Delphi обычно создается WSDL из службы.

Как создать один файл WSDL из существующего WCF сервис?

http://social.msdn.microsoft.com/Forums/en/wcf/thread/fc2c5074-1116-4f92-a972-01bb3a142535

WCF: как сгенерировать один документ WSDL без WSDL : import?

и создание прокси-класса Delphi, импортировав этот WSDL в свой проект Delphi.

>wsdlimport.exe service.wsdl

а затем используйте сгенерированный модуль Delphi в своем проекте Delphi

http://www.drbob42.com/examines/examinB9.htm

http://edn.embarcadero.com/article/36962

Параметры, которые вы отправляете для вызовов службы (имя пользователя, пароль, ClientCredientials и т. Д.), Будут определены в сгенерированном модуле Delphi - не должно быть проблем, если вы можете подключиться к службе.

person Sam    schedule 23.05.2011
comment
Ткс. Я все это сделал. Изначально я хотел выполнить проверку пользователя / пароля с помощью WCF по умолчанию UserNamePasswordValidator и web.config TransportWithMessageCredential, но я не могу понять, как отправить информацию об имени пользователя / пароле в WCF (в .net, с ClientCredentials). Сейчас я пытаюсь отправить его через SoapHeader в WCF, поскольку я успешно вызвал заголовок SOAP через Delphi. Однако, если это не сработает, я отправлю их через параметры. - person Pascal; 23.05.2011
comment
basicHttpBinding не поддерживает TransportWithMessageCredential msdn.microsoft.com/en-us/library/ ms789011.aspx - person Sam; 24.05.2011
comment
Интересно, но я заставил его работать с Https и отправлять учетные данные имени пользователя с помощью. Чистые клиенты на обоих концах провода. Отправить имя пользователя и пароль через параметры метода очень просто. Удалось ли вам работать с заголовком SOAP с помощью WCF и Delphi? Я сделал это со старыми веб-устройствами asp.net. ТКА - person Pascal; 24.05.2011
comment
Вы уверены, что клиент .Net подключается с помощью basicHttpBinding? Можете ли вы опубликовать свой файл .config для службы или показать код, который создает конечную точку httpbasic? Да, у меня есть клиент delphi, который разговаривает со службой WCF, которая предоставляет конечную точку basicHttpBinding, но трюк заключался в создании плоского wsdl с помощью WCFExtras. - person Sam; 26.05.2011
comment
Нет, у меня нет имени пользователя и пароля, отправленных в заголовке SOAP. Но у меня есть клиент Delphi, разговаривающий со службой WCF. Какой ваш приоритет? - person Sam; 26.05.2011
comment
Извините, что так долго. У меня есть два клиента Delphi XE Update Pack 1, которые без проблем разговаривают со службой WCF, используя basicHttpBinding, даже без плоского wsdl. Работал без проблем. Один из клиентов использует транспортную безопасность (HTTPS), и он хорошо работает. Моя проблема заключается в защите сообщения, поскольку оно находится в открытом Интернете. Я использовал пользователь / пароль при вызове метода, но мне бы очень хотелось использовать более элегантное решение, такое как заголовок SOAP. Я сделал это в aspx в веб-сервисах, но не смог сделать это в WCF, особенно используя UserNamePasswordValidator на стороне сервера. - person Pascal; 28.05.2011
comment
Извините, Паскаль, лучше всего, что я могу прямо сейчас, это указать вам на этот msdn.microsoft.com /en-us/library/ms731925.aspx - person Sam; 29.05.2011

Несколько недель назад мне также пришлось подключиться к службе WCF. Я закончил тем, что написал клиент в .net и использовал UnmanagedExports https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

Затем dll можно использовать в Delphi как родную dll.

person doerig    schedule 20.06.2011
comment
Это тоже хорошая идея. Таким образом вы сохраните безопасность и больше не нуждаетесь в конечных точках basicHttpBinding. Также должно быть намного быстрее. - person Sam; 20.06.2011