none
WCF + Silverlight RRS feed

  • Pergunta

  • Pessoal, Vejam se é possivel me ajudar.

    Tenho a seguinte estrutura:

    1 Servidor rodando um site em silverlight;
    1 Servidor rodando um serviço WCF;


    Estou com o seguinte problema:

    Quando eu acesso a aplicação pelo servidor (http://localhost/aplicacao) tudo funciona normalmente.
    Quando acesso a aplicação por uma maquina cliente (http://servidor/aplicacao) a comunicação com o servidor WCF não funciona.
    Se eu coloco a aplicação e o serviço no mesmo servidor tudo funciona normalmente, inclusive acessando das maquinas cliente.

    Alguma sugestão?

    Obrigado.

    MCP, MCTS 2.0 Web Applications, MCTS 3.5 ASP.NET
    sexta-feira, 15 de janeiro de 2010 13:52

Respostas

Todas as Respostas

  • Se você está criando o client com o construtor sem parâmetros, então verifique se no arquivo ServiceReferences.ClientConfig do projeto silverlight o endpoint usado.
    O arquivo deve ser parecido com esse:

    configuration>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="BasicHttpBinding_IService" maxBufferSize="2147483647"
                        maxReceivedMessageSize="2147483647">
                        <security mode="None" />
                    </binding>
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://localhost/Service.svc"
                    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
                    contract="Persistencia_ServiceReference.IService"
                    name="BasicHttpBinding_IService" />
            </client>
        </system.serviceModel>
    </configuration>
    Provavelmente você deve alterar o endpoint para de "localhost" para "servidor".

    Espero ter ajudado.
    sexta-feira, 15 de janeiro de 2010 14:02
  • Oi Fernando,

    No caso onde eu digo cliente, é acessar a aplicação(site) de uma maquina que não seja o servidor.

    MCP, MCTS 2.0 Web Applications, MCTS 3.5 ASP.NET
    sexta-feira, 15 de janeiro de 2010 14:06
  • Oi Fernando,

    No caso onde eu digo cliente, é acessar a aplicação(site) de uma maquina que não seja o servidor.

    MCP, MCTS 2.0 Web Applications, MCTS 3.5 ASP.NET

    Acho que acabei não explicando direito:

    Quando você abre a aplicação silverlight no browser, ela é "baixada" para a máquina cliente e quando procura-se pelo serviço usando o endpoint dado(http://localhost/aplicacao), ele vai procurar o serviço em localhost, ou seja na máquina cliente, o que no seu caso não é verdade.

    Por isso há necessidade de trocar o endpoint com o endereço do servidor, de preferência antes de publicar para evitar mexer dentro do arquivo .xap, porque a aplicação usa os endpoints como se estivesse na máquina cliente.

    Já tive esse problema uma vez, por isso acho que esse é o seu problema também.
    sexta-feira, 15 de janeiro de 2010 14:16
  • Agora entendi, mas não é problema no endpoint, pois o endpoint sempre aponta para o servidor que esta o serviço.


    MCP, MCTS 2.0 Web Applications, MCTS 3.5 ASP.NET
    sexta-feira, 15 de janeiro de 2010 17:14
  • Se eu coloco a aplicação e o serviço no mesmo servidor tudo funciona normalmente, inclusive acessando das maquinas cliente.
    O problema pode ser a falta do arquivo clientaccesspolicy.xml ou crossdomain.xml para definir as politicas de acesso a dados.

    Na documentação do MSDN existe uma página que explica sobre isso. Espero que seja útil.

    No blog do Israel Aece também tem informações que podem ser úteis.
    sexta-feira, 15 de janeiro de 2010 18:23
  • Até pode ser mas só se o arquivo estiver errado pois os arquivos estão la.
    MCP, MCTS 2.0 Web Applications, MCTS 3.5 ASP.NET
    sexta-feira, 15 de janeiro de 2010 18:34
  • Boas Eduardo,

    Você precisa seguir o esquema que está aqui: http://msdn.microsoft.com/en-us/library/cc838250(VS.95).aspx#crossdomain_communication

    Qual a mensagem detalhada do erro?
    http://www.israelaece.com
    segunda-feira, 18 de janeiro de 2010 10:03
    Moderador
  • Reativando...


    a mensagem de erro é a seguinte:

    An error occurred while trying to make a request to URI 'http://187.17.80.74/Services/ProtocoloService.svc'. This could be due to attempting to access a service in a cross-domain way without a proper cross-domain policy in place, or a policy that is unsuitable for SOAP services. You may need to contact the owner of the service to publish a cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent. This error may also be caused by using internal types in the web service proxy without using the InternalsVisibleToAttribute attribute. Please see the inner exception for more details.

    O serviço esta rodando nesse endereço 187.17.80.74 e o site está em outro servidor com outro IP.
    Ja coloquei os arquivos clientaccesspolicy.xml e crossdomain.xml no servidor 187.17.80.74


    Alguma sugestão?



    MCP, MCTS 2.0 Web Applications, MCTS 3.5 ASP.NET
    quinta-feira, 11 de fevereiro de 2010 19:20
  • Boas Eduardo,

    Que binding está utilizando?
    http://www.israelaece.com
    sexta-feira, 12 de fevereiro de 2010 10:00
    Moderador
  • Segue meu arquivo de config.

      <system.serviceModel>
        <services>
          <service behaviorConfiguration="HMV.PortalMedico.Service.ProtocoloServiceBehavior"
            name="HMV.PortalMedico.Service.Impl.ProtocoloService">
            <endpoint address="" binding="basicHttpBinding" contract="HMV.PortalMedico.Service.Contract.IProtocoloService" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
          <service behaviorConfiguration="HMV.PortalMedico.Service.ProtocoloServiceBehavior"
            name="HMV.PortalMedico.Service.Impl.SendEmailService">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpEndpointBinding"
              contract="HMV.PortalMedico.Service.Contract.ISendEmailService">
              <identity>
                <dns value="localhost" />
              </identity>
            </endpoint>
          </service>
        </services>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"></serviceHostingEnvironment>
        <behaviors>
          <serviceBehaviors>
            <behavior name="HMV.PortalMedico.Service.ProtocoloServiceBehavior">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <bindings>
          <basicHttpBinding>
            <binding name="basicHttpEndpointBinding">
              <security mode="TransportCredentialOnly">
                <transport clientCredentialType="Windows" />
              </security>
            </binding>
          </basicHttpBinding>
        </bindings>
      </system.serviceModel>
    MCP, MCTS 2.0 Web Applications, MCTS 3.5 ASP.NET
    sexta-feira, 12 de fevereiro de 2010 11:06
  • Boas Eduardo,

    E está acessando via HTTPS?
    http://www.israelaece.com
    sexta-feira, 12 de fevereiro de 2010 11:48
    Moderador
  • Não. Deveria?

    Lembrando que consigo consumir o serviço quando rodo ele na mesma maquina da aplicação e consigo também consumir o serviço de um teste unitario por exemplo.

    MCP, MCTS 2.0 Web Applications, MCTS 3.5 ASP.NET
    sexta-feira, 12 de fevereiro de 2010 12:26
  • Boas Eduardo,

    Dá uma olhada neste link: http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx

    Lá tem alguns cuidados sobre o HTTPS.
    http://www.israelaece.com
    quarta-feira, 17 de fevereiro de 2010 10:09
    Moderador
  • Curioso é que esse arquivo deveria liberar tudo, mas não é o que parece.

    <?xml version="1.0" encoding="utf-8"?>
    <access-policy>
      <cross-domain-access>
    <!--Enables Silverlight 3 all methods functionality-->
        <policy>
          <allow-from http-methods="*">    
            <domain uri="*"/>
          </allow-from>    
          <grant-to>    
            <resource path="/api" include-subpaths="true"/>
          </grant-to>    
        </policy>
    <!--Enables Silverlight 2 clients to continue to work normally -->
        <policy>
          <allow-from >    
            <domain uri="*"/>
          </allow-from>    
          <grant-to>    
            <resource path="/api" include-subpaths="true"/>
          </grant-to>    
        </policy>
      </cross-domain-access>
    </access-policy>
    MCP, MCTS 2.0 Web Applications, MCTS 3.5 ASP.NET
    quarta-feira, 17 de fevereiro de 2010 11:35
  • Boas Eduardo,

    E tua aplicação host que hospeda a aplicação Silverlight também está sendo acessada através de HTTPS?
    http://www.israelaece.com
    quinta-feira, 18 de fevereiro de 2010 18:57
    Moderador
  • Oi Israel,

    Nenhuma das aplicações esta usando HTTPS é tudo via HTTP
    MCP, MCTS 2.0 Web Applications, MCTS 3.5 ASP.NET
    quinta-feira, 18 de fevereiro de 2010 20:33
  • Olá , Eduardo

    Você já tentou?

    <?xml version="1.0" encoding="utf-8" ?>
    <access-policy>
      <cross-domain-access>
        <policy>
          <allow-from http-request-headers="*">
              <domain uri="http://*"/>
              <domain uri="https://*"/>
          </allow-from>
          <grant-to>
            <resource include-subpaths="true" path="/"/>
          </grant-to>
        </policy>
      </cross-domain-access>
    </access-policy>
    http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx
    http://msdn.microsoft.com/en-us/library/cc197955(VS.95).aspx

    Américo Arvani MCP/MCTS - WEB
    • Marcado como Resposta Eduardo Costa sexta-feira, 19 de fevereiro de 2010 13:47
    quinta-feira, 18 de fevereiro de 2010 23:17
  • Cara, resolveu o problema em partes, ja melhorou alguma coisa.

    Seguinte, consegui acessar o serviço da aplicação, porem...

    Quando eu acesso a aplicação silverlight via localhost funciona que é uma beleza, mas quando eu acesso a mesma aplicação apartir de outro maquina utilizando o endereço por exemplo abc.com.br não vai, só vai com localhost.

    O que pode ser?

    Valeu a ajuda ai
    MCP, MCTS 2.0 Web Applications, MCTS 3.5 ASP.NET
    sexta-feira, 19 de fevereiro de 2010 12:40
  • Ah o erro é o mesmo:

    An error occurred while trying to make a request to URI 'xxx'. This could be due to attempting to access a service in a cross-domain way without a proper cross-domain policy in place, or a policy that is unsuitable for SOAP services. You may need to contact the owner of the service to publish a cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent. This error may also be caused by using internal types in the web service proxy without using the InternalsVisibleToAttribute attribute. Please see the inner exception for more details.

    Quando eu acesso a aplicação silverlight por "localhost" funciona, se eu acesso 127.0.0.1 ja não funciona.

    MCP, MCTS 2.0 Web Applications, MCTS 3.5 ASP.NET
    sexta-feira, 19 de fevereiro de 2010 12:53
  • Você já tentou depurar o problema por partes, verificar se no servidor IIS está configurado para rodar a aplicação corretamente , se não tem nenhum firewal dificultando o acesso , a maquina (usuario) que você está tentando acessar tem permissão para ter esse acesso?

    Tente alterar o endpoint

    na linha

    <identity>
                <dns value="localhost" />
              </identity>
    

    para

    <identity>
                <dns value="187.17.80.74" />
              </identity>
    




    http://msdn.microsoft.com/en-us/library/ms733130.aspx
    Américo Arvani MCP/MCTS - WEB
    • Marcado como Resposta Eduardo Costa sexta-feira, 19 de fevereiro de 2010 16:25
    sexta-feira, 19 de fevereiro de 2010 13:20
  • Certamente tem alguma coisa que não estou conseguindo verificar. A principio não teria problema de rede bloqueando o acesso. Fiz a troca do identity no endpoint e não adiantou.
    É bem estranho isso pois estou na maquina onde publiquei a aplicação silverlight, quando acesso ela via http://localhost funciona normal, quando acesso http://127.0.0.1 não funciona, se tento em outras maquinas com o ip dela http://10.0.1.27 tambem nao funciona, apenas localhost, e o silverlight funciona normalmente, o erro da na hora de se comunicar com o WCF

    MCP, MCTS 2.0 Web Applications, MCTS 3.5 ASP.NET
    sexta-feira, 19 de fevereiro de 2010 13:33
  • Tente retirar as clausulas de segurança no EndPoint

    <bindings>
        <wsHttpBinding>
          <binding name="basicHttpEndpointBinding">
            <security>
              <message clientCredentialType="None" />
            </security>
          </binding >
          </wsHttpBinding>
      </bindings>

    Américo Arvani MCP/MCTS - WEB
    sexta-feira, 19 de fevereiro de 2010 13:40
  • Acho que a dica de trocar o identity funcionou, eu que não tinha testado direito.

    Valeu cara

    MCP, MCTS 2.0 Web Applications, MCTS 3.5 ASP.NET
    sexta-feira, 19 de fevereiro de 2010 16:25