2013-09-03 3 views
0

У меня есть веб-сервис, реализованный на 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> 

Заранее спасибо

ответ

0

Трудно сказать, без образца того, как ваш SOAP сообщение от WSE3 выглядит на проводе. Попытайтесь получить его через Fiddler и опубликуйте здесь.

Как правило, если вы используете SSL попробовать что-то вроде этого:

<bindings> 
     <basicHttpBinding> 
      <binding name="NewBinding0"> 
       <security mode="TransportWithMessageCredential " /> 
      </binding> 
     </basicHttpBinding> 
</bindings> 

Если вы не используете SSL try CUB.

+0

Спасибо за ответ. В вышеприведенном сообщении я ничего не вижу после предложения о SSL. Я использую SSL, поэтому мне было бы интересно просмотреть это предложение. Я хотел бы использовать fiddler или tcpmon для просмотра передаваемых данных, но я работаю в защищенной среде, и мы не можем загружать что-либо из Интернета, и эти инструменты недоступны мне. Я попытался включить диагностическую трассировку внутри приложения WSE, но это привело к исключению нулевого указателя в строке кода выше, где я создаю новый экземпляр UsernameToken, просто добавив диагностику. – James

+0

еще раз проверьте сейчас –

+0

Спасибо - он отправлен сейчас. Я изменил свой WCF-клиент на использование этой привязки, но результатом было InvalidOperationException с сообщением «привязка BasicHttp» требует, чтобы BasicHttpBinding.Security.Message.ClientCredentialType был эквивалентен типу учетных данных BasicHttpMessageCredentialType.Certificate для защищенных сообщений. Выберите «Транспорт» или «ТранспортWithMessageCredential» для UserName credentials " – James