Я был во всей сети для этого. . У меня только что было чертовски много времени, и поставщик, чей веб-сервис я пытаюсь использовать, отказывается официально поддерживать WCF как метод потребления.
Я не эксперт по веб-сервисам, поэтому я сделаю все возможное, чтобы задокументировать и объяснить этот начальный пост, но, во что бы то ни стало, запросите дополнительную информацию, если она вам нужна, и, надеюсь, я смогу предоставить все, что вам нужно. является необходимым.
Служба
В моей компании мы используем приложение поставщика, которое предоставляет службу. Приложение написано на Java, и похоже, что wsdl был создан с помощью Apache Axis 1.2.
Код
Мой устаревший код использует WSE 3.0. В частности, он использует прокси-классы с автоматически добавленным «WSE» в конце. Это позволяет мне использовать гораздо более простую схему аутентификации (единственный способ заставить ее работать). Мне не нужно использовать сертификаты. Я использую производную от SecurityPolicyAssertion
и оборачиваю ее в объект Policy
, который передается методу SetPolicy
клиентского класса. Вот все, что мне нужно сделать, чтобы создать работающий экземпляр клиента:
MyWebServiceWse api = new MyWebServiceWse();
api.Url = myUrl;
api.SetPolicy(new Policy(new MyDerivedSecurityAssertion(user, pass)));
Мой готовый код по умолчанию для WCF (сгенерированный с помощью ссылки на службу) не принимает учетные данные, поэтому я знаю, что это проблема. с места в карьер. Я читал в Интернете разные вещи об использовании различных настроек безопасности
или настроек привязки в моем app.config
, но ничего не работало полностью. Моя самая распространенная ошибка после тщательной обработки — WSDoAllReceiver: Запрос не содержит требуемого заголовка безопасности
.
Вот файл app.config. Возможно, мы могли бы начать с рассказа о том, что здесь следует изменить, чтобы облегчить передачу учетных данных — опять же, я видел в Интернете разные мнения.
Я изменил некоторые атрибуты, чтобы скрыть конкретную услугу, которую мы используем (политика компании и все такое).
А вот пример кода C# на данный момент (тестирование в консольном приложении):
MyClient client = new MyClient();
client.listMethod();
ОБНОВЛЕНИЕ
Прочитайте этот пост SO: wcf security . . . .
Я соответствующим образом обновил свой app.config и теперь передаю имя пользователя и пароль в коде. Я все еще получаю ту же ошибку:
WSDoAllReceiver: Request does not contain required Security header
20120517 ОБНОВЛЕНИЕ
Успешный запрос (от WSE3):
urn:uuid:cb739422-c077-4eec-8cb2-686837b76878
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
http://removed-for-security
2012-05-17T11:25:41Z
2012-05-17T11:30:41Z
change-to-protect-the-innocent
nice-try
KJMvUuWF2eO2uIJCuxJC4A==
2012-05-17T11:25:41Z
0
10
Работа над получением трассировки WCF — скоро будет добавлено.
20120517 ОБНОВЛЕНИЕ 2
А вот конверт из WCF:
1
2147483647
20120518 ОБНОВЛЕНИЕ Я попытался реализовать решение в сообщении, на которое Майк Миллер ссылается в комментариях. Теперь я получаю следующую ошибку (сообщение не отправляется, потому что что-то не так в схеме):
The provided URI scheme 'http' is invalid; expected 'https'.
И если кто-то хочет спросить, да, мне нужно отправить по http, и да, я знаю, что учетные данные отправляются как незашифрованные строки :-)