Работает, к сожалению, перед прочтением Великолепного ответа wsanville .
Чтобы помочь другим, я публикую все шаги, необходимые для работы с Visual Studio 2005:
- Установить WSE 3.0 , выбрать custom и выбрать все
- Чтение Реализация прямой аутентификации с токеном имени пользователя в WSE 3.0 для подсказок
- Перезапустите Visual Studio 2005, теперь щелкните правой кнопкой мыши свой проект в обозревателе решений, и у вас должен появиться пункт меню WSE Settings 3.0 и используйте его, если хотите.
- Обновите ваши веб-ссылки, это должно создать новый прокси-класс веб-службы HTTP с другим именем, например,
YourWsNameHttpServiceWse
. По сути это то же самое, что и запуск wsewsdl3.exe
- Используйте этот новый класс, и у вас должен быть доступ к методам и свойствам WSE, таким как
SetClientCredential
.
Я закончил тем, что делал почти все в коде, вместо того, чтобы полагаться на файлы конфигурации, которые созданы с моей C # DLL. Код в итоге выглядел так:
FooBarHttpServiceWse wse = new FooBarHttpServiceWse();
wse.SetClientCredential(new UsernameToken(
"username",
"password",
PasswordOption.SendPlainText));
wse.SetPolicy(new FooBarPolicy());
wse.CallSomeServerFunction(yourRequest)
Я создал собственную политику, которая выглядела так:
using Microsoft.Web.Services3.Design;
// ...
public class FooBarPolicy : Policy
{
public FooBarPolicy()
{
this.Assertions.Add(new UsernameOverTransportAssertion());
}
}
Наконец, сервер WebSphere ответил, что Требуемый заголовок, представляющий свойство адресации сообщения, отсутствует , и проверяя исходящее сообщение (используя симпатичный инструмент Fiddler ), я увидел SOAP ошибка сервера указала, что заголовок Action отсутствует.
Я тщетно пытался установить элемент wsa:Action
сам:
using Microsoft.Web.Services3.Addressing;
// ...
wse.RequestSoapContext.Addressing.Action = new Action("CallSomeServerFunction");
Проблема заключалась в том, что даже если я установил действие, когда оно было отправлено по проводам, оно было пустым. Оказалось, мне пришлось открыть прокси-класс WSE и отредактировать там атрибут:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute(
"---Edit this to set wsa:Action---",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
// ...
public SomeServerFunction(...)
После этого все получилось.