none
Compatibilidade entre versões - wsHttpBinding e basicHttpBinding RRS feed

  • Pergunta

  • Verifiquei que para manter a compatibilidade com a versão 2.0 do framework preciso utilizar o basicHttpBinding, mas não posso para um serviço disponibilizar tanto o basicHttpBinding quanto o wsHttpBinding?

    Gostaria de disponibilizar um binding especifico para cada versão, tentei a configuração abaixo mas não funciona:

    	<system.serviceModel>
    		<services>
    			<service name="Servicos.SvcArquivo" behaviorConfiguration="MetadataBehavior">
    				<host>
    					<baseAddresses>
    						<add baseAddress="http://localhost/Servicos"/>
    					</baseAddresses>
    				</host>
    				<endpoint address="2.0" binding="basicHttpBinding" contract="Servicos.Contratos.ISvcArquivo" />
    				<endpoint address="3.5" binding="wsHttpBinding" contract="Servicos.Contratos.ISvcArquivo" />
    				<endpoint address="mex"	binding="mexHttpBinding" contract="IMetadataExchange" />
    			</service>
    		</services>
    		<behaviors>
    			<serviceBehaviors>
    				<behavior name="MetadataBehavior">
    					<serviceMetadata httpGetEnabled="True" />
    				</behavior>
    			</serviceBehaviors>
    		</behaviors>
    	</system.serviceModel>
    

     

    quinta-feira, 1 de abril de 2010 14:09

Respostas

  • Boas Leandro,

    Quando você referencia na aplicação cliente um serviço WCF que possui 2 endereços, então você precisa trabalhar com o proxy de forma diferente, ou seja, você não pode mais utilizar o construtor do proxy que não aceita parâmetros. Repare que no arquivo de configuração, há dos dois enpoints, e cada um dele recebe um nome:

    <client>
      <endpoint address="http://localhost:8787/Servicos/2.0" binding="basicHttpBinding"
          bindingConfiguration="BasicHttpBinding_IContrato" contract="IContrato"
          name="BasicHttpBinding_IContrato" />
      <endpoint address="http://localhost:8787/Servicos/3.5" binding="wsHttpBinding"
          bindingConfiguration="WSHttpBinding_IContrato" contract="IContrato"
          name="WSHttpBinding_IContrato">
        <identity>
          <userPrincipalName value="IsraelAeceNB1\Israel Aece" />
        </identity>
      </endpoint>
    </client>

    Sendo assim, você precisa especificar o nome do endpoint que o proxy deve utilizar para invocar o serviço:

    using (ContratoClient p = new ContratoClient("WSHttpBinding_IContrato"))
    {
        Console.WriteLine(p.Ping("x"));
    }


    http://www.israelaece.com
    sexta-feira, 2 de abril de 2010 13:22
    Moderador

Todas as Respostas

  • Boas Leandro,

    Qual o problema que ocorre?
    http://www.israelaece.com
    quinta-feira, 1 de abril de 2010 14:25
    Moderador
  • Quando eu procuro pelo caminho http://localhost/Servicos/3.5 ele não encontra nenhuma referencia dando erro 404.

    Se utilizo o comando Discover -> Services in Solution aparece apenas o serviço gerado pelo mex.

    Se eu incluo este serviço e executo a aplicação ocorre o erro:

    Não foi possível localizar o elemento de ponto de extremidade com nome '3.5' e contrato 'SvcArquivo.ISvcArquivo' na seção de configuração do ServiceModel cliente. Isso pode ter ocorrido devido à falta de um arquivo de configuração para o seu aplicativo ou porque nenhum elemento de ponto de extremidade correspondendo a este nome pôde ser encontrado no elemento cliente.

    quinta-feira, 1 de abril de 2010 19:33
  • Boas Leandro,

    Quando você referencia na aplicação cliente um serviço WCF que possui 2 endereços, então você precisa trabalhar com o proxy de forma diferente, ou seja, você não pode mais utilizar o construtor do proxy que não aceita parâmetros. Repare que no arquivo de configuração, há dos dois enpoints, e cada um dele recebe um nome:

    <client>
      <endpoint address="http://localhost:8787/Servicos/2.0" binding="basicHttpBinding"
          bindingConfiguration="BasicHttpBinding_IContrato" contract="IContrato"
          name="BasicHttpBinding_IContrato" />
      <endpoint address="http://localhost:8787/Servicos/3.5" binding="wsHttpBinding"
          bindingConfiguration="WSHttpBinding_IContrato" contract="IContrato"
          name="WSHttpBinding_IContrato">
        <identity>
          <userPrincipalName value="IsraelAeceNB1\Israel Aece" />
        </identity>
      </endpoint>
    </client>

    Sendo assim, você precisa especificar o nome do endpoint que o proxy deve utilizar para invocar o serviço:

    using (ContratoClient p = new ContratoClient("WSHttpBinding_IContrato"))
    {
        Console.WriteLine(p.Ping("x"));
    }


    http://www.israelaece.com
    sexta-feira, 2 de abril de 2010 13:22
    Moderador