none
Publicação Silverlight + WCF + SSL. Dúvida de configuração da Tag ServiceModel em Produção RRS feed

  • Pergunta

  • Pessoal,
        desenvolvemos na mesma solução um projeto Web que contém nossos serviços WCF, e vários projetos Silverlight que consomem esse serviço em ambiente seguro (SSL). Desenvolvido com Visual Studio 2010 e Silverlight 4.
      
        Estou com problemas em configurar o arquivo Web.config para achar os serviços WCF.
        Nos servidores de teste usamos da seguinte forma que funciona perfeitamente:
      
     
     <system.serviceModel>
     <services>
     <service name="NamespaceAqui.Services.ServiceSuper" behaviorConfiguration="ServBehave" >
     <endpoint
     address=""
      binding="basicHttpBinding"
      bindingConfiguration="SecureTransport"
      contract="NamespaceAqui.Services.IServiceSuper"/>
     </service>
    
     <service name="NamespaceAqui.Services.ServiceTel" behaviorConfiguration="ServBehave" >
     <endpoint
     address=""
      binding="basicHttpBinding"
      bindingConfiguration="SecureTransport"
      contract="NamespaceAqui.Services.IServiceTel"/>
     </service>
     </services>
    
     <bindings>
     <basicHttpBinding>
    
    
     <binding name="SecureTransport" maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647">
     <security mode="Transport">
      <transport clientCredentialType="None" proxyCredentialType="None" />
     </security>
     </binding>
    
    
     </basicHttpBinding>
     </bindings>
     <behaviors>
    
    
     <serviceBehaviors>
     <behavior name="ServBehave">
     <serviceMetadata httpsGetEnabled="true" />
     <serviceDebug includeExceptionDetailInFaults="false" httpHelpPageEnabled="true" httpsHelpPageEnabled="true" />
     <dataContractSerializer maxItemsInObjectGraph="100000"/>
     </behavior>
     </serviceBehaviors>
    
    
     </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/>
     </system.serviceModel>
    
      
        E no servidor de produção não funcionou como descrito acima.
        Tivemos que deixar a Tag do ServiceModel vazia para funcionar, dessa forma:
      
      
     <system.serviceModel>
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/>
     </system.serviceModel>
    
       Dentro do projeto Silverlight para me conectar com o serviço WCF que esta dentro do Web, estou fazendo usando aquela forma generica, com os seguintes trechos de código:
     
    EndpointAddress endpoint;
    endpoint = new System.ServiceModel.EndpointAddress( new Uri( Application.Current.Host.Source, "../Services/ServiceTel.svc") );
    
    BasicHttpBinding bind = new BasicHttpBinding( );
    bind.MaxReceivedMessageSize = int.MaxValue;
    bind.MaxBufferSize = int.MaxValue;
    
    if( Application.Current.Host.Source.Scheme.Equals( "https", StringComparison.InvariantCultureIgnoreCase ) )
    {
     bind.Security.Mode = BasicHttpSecurityMode.Transport;
    }
    
    
    ServiceTelemetry.ServiceTelClient objReturn = new ServiceTelemetry.ServiceTelClient( bind, endpoint );
    
       A pasta dos serviços estão compartilhadas no IIS e com permissão Full para Everyone.
      
           
        Pergunta é:
        - Porque não funcionou em produção assim como no servidor de teste?
        - Se for configuração do servidor, o que pode ser?
        - Falta alguma configuração no IIS?




    sexta-feira, 13 de maio de 2011 14:31

Respostas

  • Boas Clayr,

    O binding BasicHttpBinding, por padrão, não possui segurança alguma, ou seja, a comunicação entre o cliente e o serviço é feita utilizando apenas o HTTP, o que possibilita a interceptação da mensagem.

    Se teu serviço não expõe e/ou recebe nenhum dado sigiloso, então você pode manter somente em HTTP.
    http://www.israelaece.com
    segunda-feira, 23 de maio de 2011 10:46
    Moderador
  • Boas Clayr,

    Sim, está garantindo sim. O que eu quis dizer acima é que quando você não configura o binding para Transport, ele não protege a comunicação via transporte, ou seja, a configuração padrão é sempre via HTTP.
    http://www.israelaece.com
    terça-feira, 24 de maio de 2011 10:50
    Moderador

Todas as Respostas

  • Boas Clayr,

    E qual mensagem de erro está tendo? Quando você usa HTTPS, você precisa sim do certificado devidamente configurado dentro do IIS.

    O fato de você omitir a configuração do serviço no Web.config, muito provavelmente o mesmo está sendo exposta através de HTTP apenas.
    http://www.israelaece.com
    terça-feira, 17 de maio de 2011 10:43
    Moderador
  • Israel,

    Ele não estava mostrando a mensagem de erro, simplesmente não conectava com o serviço. Vi seu site e adaptei agora a minha aplicação para lançar as mensagens de erro para o Silverlight.

    Em tenho o certificado SSL configurado no IIS da minha aplicação.
    Só consegui abrir minhas páginas em Silverlight quando removi toda a configuração no arquivo de WebConfig. Se eu coloco a configuração como esta funcionando no servidor de teste, para de funcionar.

    A falta dessa configuração pode implicar em algo? O modo de conexão que eu faço atualmente do Silverlight para o WCF deixa a configuração do Web.Config obsoleto?

    terça-feira, 17 de maio de 2011 20:47
  • Boas Clayr,

    O binding BasicHttpBinding, por padrão, não possui segurança alguma, ou seja, a comunicação entre o cliente e o serviço é feita utilizando apenas o HTTP, o que possibilita a interceptação da mensagem.

    Se teu serviço não expõe e/ou recebe nenhum dado sigiloso, então você pode manter somente em HTTP.
    http://www.israelaece.com
    segunda-feira, 23 de maio de 2011 10:46
    Moderador
  • Israel,

    EndpointAddress endpoint;
    endpoint = new System.ServiceModel.EndpointAddress( new Uri( Application.Current.Host.Source, "../Services/ServiceTel.svc") );
    
    BasicHttpBinding bind = new BasicHttpBinding( );
    bind.MaxReceivedMessageSize = int.MaxValue;
    bind.MaxBufferSize = int.MaxValue;
    
    if( Application.Current.Host.Source.Scheme.Equals( "https", StringComparison.InvariantCultureIgnoreCase ) )
    {
     bind.Security.Mode = BasicHttpSecurityMode.Transport;
    }
    
    
    ServiceTelemetry.ServiceTelClient objReturn = new ServiceTelemetry.ServiceTelClient( bind, endpoint );
    
    
    

     

    Esse tipo de conexão de dentro do Silverlight chamando meu serviço WCF por HTTPS não esta me garantindo a segurança?!

     

    segunda-feira, 23 de maio de 2011 13:28
  • Boas Clayr,

    Sim, está garantindo sim. O que eu quis dizer acima é que quando você não configura o binding para Transport, ele não protege a comunicação via transporte, ou seja, a configuração padrão é sempre via HTTP.
    http://www.israelaece.com
    terça-feira, 24 de maio de 2011 10:50
    Moderador