У меня есть веб-сервис, реализованный на Java, который в настоящее время вызывается клиентом WSE 3.0, и я хотел бы перейти от WSE к WCF. Используя стандартные инструменты, я создал клиента, который может вызывать веб-службу, но возвращает SoapException с сообщением «Требуемое значение параметра отсутствует». Веб-служба использует HTTPS и требует имя пользователя & пароль для предоставления. В существующем WSE кода клиента, площадь учетных данных поддерживаются подклассы SecurityPolicyAssertion и SendSecurityFilter следующим образом:Перенос клиента WSE в WCF - как заменить SecurityPolicyAssertion и UsernameToken?
public class UTClientAssertion : SecurityPolicyAssertion
{
public UTClientAssertion()
{
}
public override SoapFilter CreateClientOutputFilter(FilterCreationContext context)
{
return new ClientOutputFilter(this, context);
}
public override SoapFilter CreateClientInputFilter(FilterCreationContext context)
{
// we don't provide ClientInputFilter
return null;
}
public override SoapFilter CreateServiceInputFilter(FilterCreationContext context)
{
// we don't provide any processing for web service side
return null;
}
public override SoapFilter CreateServiceOutputFilter(FilterCreationContext context)
{
// we don't provide any processing for web service side
return null;
}
#region ClientOutputFilter
class ClientOutputFilter : SendSecurityFilter
{
public ClientOutputFilter(UTClientAssertion parentAssertion, FilterCreationContext context)
: base(parentAssertion.ServiceActor, false, parentAssertion.ClientActor)
{
}
public override void SecureMessage(SoapEnvelope envelope, Security security)
{
UsernameToken token = new UsernameToken("UserName", "Password", PasswordOption.SendPlainText);
security.Tokens.Add(token);
security.MustUnderstand = false;
}
}
#endregion
Этих классов применяются для сгенерированного класса прокси в клиенте следующим образом:
// Create the web service client
ListService objListSvc = new ListService();
//code to set up the security policy and user assertion
UTClientAssertion objAssertion = new UTClientAssertion();
// create policy, add the assertion, and set it on the web service
Policy objPolicy = new Policy();
objPolicy.Assertions.Add(objAssertion);
objListSvc.SetPolicy(objPolicy);
Я обнаружил, что если я отредактирую код клиента WSE, чтобы удалить строку objListSvc.SetPolicy (objPolicy), я получаю такое же сообщение об ошибке «Требуемое значение параметра отсутствует».
Какова эквивалентная конфигурация/код WCF в соответствии с кодом WSE выше, который настраивает имя пользователя и пароль для этой веб-службы? Конфигурация WCF используется по умолчанию, который был сгенерирован:
<basicHttpBinding>
<binding name="ListBinding" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
Заранее спасибо
Спасибо за ответ. В вышеприведенном сообщении я ничего не вижу после предложения о SSL. Я использую SSL, поэтому мне было бы интересно просмотреть это предложение. Я хотел бы использовать fiddler или tcpmon для просмотра передаваемых данных, но я работаю в защищенной среде, и мы не можем загружать что-либо из Интернета, и эти инструменты недоступны мне. Я попытался включить диагностическую трассировку внутри приложения WSE, но это привело к исключению нулевого указателя в строке кода выше, где я создаю новый экземпляр UsernameToken, просто добавив диагностику. – James
еще раз проверьте сейчас –
Спасибо - он отправлен сейчас. Я изменил свой WCF-клиент на использование этой привязки, но результатом было InvalidOperationException с сообщением «привязка BasicHttp» требует, чтобы BasicHttpBinding.Security.Message.ClientCredentialType был эквивалентен типу учетных данных BasicHttpMessageCredentialType.Certificate для защищенных сообщений. Выберите «Транспорт» или «ТранспортWithMessageCredential» для UserName credentials " – James