none
Múltiplos end points em um mesmo serviço RRS feed

  • Pergunta


  • Queria poder ter um end point com um wsHttpBinding para os serviços normais fornecidos pelo meu webService e outro com um netTcpBinding para fornecer os serviços de download e upload de imagens. Aí ficam as dúvidas:

    Como posso adicionar vários end points em um mesmo serviço?

    Como meu cliente reconhece ou escolhe qual end point será utilizado?

    quarta-feira, 4 de novembro de 2009 12:20

Respostas

  • Boas Marcos,

    Mas que tipo de projeto que criou? Se você está utilizando o projeto do tipo WCF Service, então você está condicionado a utilizar o HTTP, a menos que você publique no IIS 7.0 e configure o suporte ao protocolo TCP no Painel de Controle.
    http://www.israelaece.com
    • Marcado como Resposta Marcos Latchuk quarta-feira, 4 de novembro de 2009 19:00
    quarta-feira, 4 de novembro de 2009 18:12
    Moderador

Todas as Respostas

  • Bom dia amigo,

    Tem duas maneiras:
    1) vc pode criar um binding dinâmico, em tempo de execução.
    Ex:
     
    Uri baseAddr = new Uri("http://localhost:8000/WCFService1");
    ServiceHost localHost = new ServiceHost(typeof(CalculatorService), baseAddr);
    
    try
    {
          localHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");
    ...
    ...
    ...

    2) Vc pode definir em arquivo de configuração:

    <system.serviceModel>
        <bindings>
          <netNamedPipeBinding>
            <binding name="NamedPipesConfiguration"
                     hostNameComparisonMode="StrongWildcard"
                     maxReceivedMessageSize="2147483647">
              <readerQuotas maxDepth="64"
                            maxStringContentLength="2147483647"
                            maxArrayLength="2147483647"
                            maxBytesPerRead="4096"
                            maxNameTableCharCount="16384"/>
              <security mode="None">
                <transport protectionLevel="None" />
              </security>
            </binding>
          </netNamedPipeBinding>
          <netTcpBinding>
            <binding name="TCPConfiguration">
              <security mode="None">
                <transport clientCredentialType="None" protectionLevel="None" />
                <message clientCredentialType="None" />
              </security>
            </binding>
          </netTcpBinding>
        </bindings>
        <services>
          <service name="TestNetPipes">
            <endpoint address="net.pipe://localhost/Test"
                      name="NamedPipes"
                      binding="netNamedPipeBinding"
                      bindingConfiguration="NamedPipesConfiguration"
                      contract="MyApp.ITest" />
            <endpoint address="net.tcp://localhost/Test"
                      name="TCP"
                      binding="netTcpBinding"
                      bindingConfiguration="TCPConfiguration"
                      contract="MyApp.ITest" />
          </service>
        </services>
      </system.serviceModel>
    Att.

    Vinicius
    Se a resposta foi útil, não esqueça de marcá-la. _________________________________________________________ "Nada é tão ruim que não possa piorar" diz o filósofo....."Tava funcionando lá em casa..." diz o programador.
    quarta-feira, 4 de novembro de 2009 12:40
  • É exatamente isso que estou tentando fazer amigo, mas o seguinte erro está sendo lançado:

    Não foi possível localizar um endereço base que corresponda ao esquema net.tcp para o ponto de extremidade com ligação NetTcpBinding. Os esquemas de endereços base são [http].

    É assim que está meu web.config:

    <system.serviceModel>
        <services>
          <service behaviorConfiguration="WebService.ServicoBehavior" name="WebService.Servico">
            <endpoint address="" binding="wsHttpBinding" contract="WebService.IServico" bindingConfiguration="BindingConfig" />
            <endpoint address="" binding="netTcpBinding" contract="WebService.IServicoStream" bindingConfiguration="BindingConfigStream" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
        </services>
        <bindings>
          <wsHttpBinding>
            <binding name="BindingConfig">
              <security mode="Message">
                <message clientCredentialType="UserName"/>
              </security>
            </binding>
          </wsHttpBinding>
          <netTcpBinding>
            <binding name="BindingConfigStream" transferMode="Streamed" maxReceivedMessageSize="90000000" maxBufferPoolSize="90000000" >
              <security mode="Message">
                <message clientCredentialType="UserName"/>
              </security>
            </binding>
          </netTcpBinding>
        </bindings>
        <behaviors>
          <serviceBehaviors>
            <behavior name="WebService.ServicoBehavior">
              <serviceCredentials>
                <serviceCertificate
                  findValue="e5 62 55 d5 3d a3 af 88 41 50 10 32 c5 e4 c1 eb"
                  storeLocation="LocalMachine"
                  storeName="TrustedPeople"
                  x509FindType="FindBySerialNumber"/>
                <userNameAuthentication
                  userNamePasswordValidationMode="Custom"
                  customUserNamePasswordValidatorType="WebService.Seguranca.Autenticacao, WebService"/>
              </serviceCredentials>
              <serviceAuthorization
                principalPermissionMode="Custom"
                serviceAuthorizationManagerType="WebService.Seguranca.GerenciadorAutorizacao, WebService">
                <authorizationPolicies>
                  <add policyType="WebService.Seguranca.PoliticaAutorizacao, WebService"/>
                </authorizationPolicies>
              </serviceAuthorization>
              <serviceMetadata httpGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>

    O que devo fazer??
    quarta-feira, 4 de novembro de 2009 12:49
  • Humm.. nunca tentei usar net.tcp binding desta forma.. eu usei um windows service pra fazer o host de dois endpoints e funcionou.. agora dessa forma não sei...
    Foi mal não poder ajudar melhor.

    Falow

    Se a resposta foi útil, não esqueça de marcá-la. _________________________________________________________ "Nada é tão ruim que não possa piorar" diz o filósofo....."Tava funcionando lá em casa..." diz o programador.
    quarta-feira, 4 de novembro de 2009 13:12
  • quarta-feira, 4 de novembro de 2009 13:20
    Moderador
  • Ok Israel, muito bom os videos, tenho ainda mais informação para a construção do meu serviço.

    Mas ainda tenho problemas aqui, o seguinte erro é lançado:

    Não há suporte ao protocolo 'net.tcp'

    A minha configuração está assim:


      <system.serviceModel>
        <services>
          <service behaviorConfiguration="WebService.ServicoBehavior" name="WebService.Servico">
            <endpoint address="" binding="wsHttpBinding" contract="WebService.IServico" bindingConfiguration="BindingConfig" />
            <endpoint address="net.tcp://tcp.fotorevelacao.com/stream" binding="netTcpBinding" contract="WebService.IServicoStream" bindingConfiguration="BindingConfigStream" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            <host>
              <baseAddresses>
                <add baseAddress="net.tcp://tcp.fotorevelacao.com/stream" />
              </baseAddresses>
            </host>
          </service>
        </services>
        <bindings>
          <wsHttpBinding>
            <binding name="BindingConfig">
              <security mode="Message">
                <message clientCredentialType="UserName"/>
              </security>
            </binding>
          </wsHttpBinding>
          <netTcpBinding>
            <binding name="BindingConfigStream" transferMode="Streamed" maxReceivedMessageSize="90000000" maxBufferPoolSize="90000000" >
              <security mode="Transport">
                <message clientCredentialType="UserName"/>
              </security>
            </binding>
          </netTcpBinding>
        </bindings>
    </configuration>
    quarta-feira, 4 de novembro de 2009 16:25
  • essa é a pilha de excessões:

    [InvalidOperationException: Não há suporte ao protocolo 'net.tcp'.]
       System.ServiceModel.Activation.HostedTransportConfigurationManager.InternalGetConfiguration(String scheme) +11461251
       System.ServiceModel.Channels.TransportChannelListener.OnOpening() +84
       System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +229
       System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout) +72
    
    [InvalidOperationException: O ChannelDispatcher em 'net.tcp://fotorevelacao/' com contrato(s) '"IServicoStream"' não consegue abrir sua IChannelListener.]
       System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout) +118
       System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +261
       System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) +107
       System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +261
       System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +121
       System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +479
    
    [ServiceActivationException: Não é possível ativar o serviço '/Servico.svc' devido a uma exceção durante a compilação. A mensagem de exceção é: O ChannelDispatcher em 'net.tcp://fotorevelacao/' com contrato(s) '"IServicoStream"' não consegue abrir sua IChannelListener..]
       System.ServiceModel.AsyncResult.End(IAsyncResult result) +11536522
       System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +194
       System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, Boolean flowContext) +176
       System.ServiceModel.Activation.HttpModule.ProcessRequest(Object sender, EventArgs e) +278
       System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68
       System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
    
    quarta-feira, 4 de novembro de 2009 16:38
  • Acho que consegui fazer algum progresso adicionando um mex para meu novo binding

    <services>
          <service behaviorConfiguration="WebService.ServicoBehavior" name="WebService.Servico">
            <endpoint address="" binding="wsHttpBinding" contract="WebService.IServico" bindingConfiguration="BindingConfig" />
            <endpoint address="net.tcp://localhost/Servico.svc/UploadImagem" binding="netTcpBinding" contract="WebService.IServicoStream" bindingConfiguration="BindingConfigStream" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
          </service>
        </services>
    Mas aí o seguinte erro é lançado:

    Não foi possível localizar um endereço base que corresponda ao esquema net.tcp para o ponto de extremidade com ligação MetadataExchangeTcpBinding. Os esquemas de endereços base são [http].

    Não sei o que devo fazer... em lugar algum consegui encontrar um exemplo de um netTcpBinding funcionando no mesmo serviço de um wsHttpBinding!
    quarta-feira, 4 de novembro de 2009 17:40
  • Boas Marcos,

    E você está utilizando o que como hosting? O IIS?
    http://www.israelaece.com
    quarta-feira, 4 de novembro de 2009 18:09
    Moderador
  • Estou rodando a aplicação pelo VisualStudio, ainda não publiquei.
    quarta-feira, 4 de novembro de 2009 18:11
  • Boas Marcos,

    Mas que tipo de projeto que criou? Se você está utilizando o projeto do tipo WCF Service, então você está condicionado a utilizar o HTTP, a menos que você publique no IIS 7.0 e configure o suporte ao protocolo TCP no Painel de Controle.
    http://www.israelaece.com
    • Marcado como Resposta Marcos Latchuk quarta-feira, 4 de novembro de 2009 19:00
    quarta-feira, 4 de novembro de 2009 18:12
    Moderador
  • Exato Israel, eu criei um projeto WCF Service.

    Mas não há uma maneira de configurar o visual para que eu possa testar por ele? Ou terei mesmo que publicar o serviço no IIS?
    quarta-feira, 4 de novembro de 2009 18:15
  • Caro Marcos

    Utilize a seguinte configuração no seu arquivo app.config:

     

    <?xml version="1.0" encoding="utf-8" ?>

    <configuration>

    <system.serviceModel>

    <services>

    <service name="EABR.ServiceBus.ETL_Entity.ETL_EntitySvc" behaviorConfiguration="MEX">

    <host>

    <baseAddresses>

    <add baseAddress="http://172.17.1.132:8034/ETL_EntitySvc/" />

    <add baseAddress="net.tcp://172.17.1.132:8035/ETL_EntitySvc/" />

    </baseAddresses>

    </host>

    <endpoint name="MEX" address="mex" contract="IMetadataExchange" binding="mexTcpBinding" />

    <endpoint address="MEX" contract="IMetadataExchange" binding="mexHttpBinding"  />

    <endpoint name="ETL_EntitySvcHTTP" address="" contract="EABR.ServiceBus.ETL_Entity.IETL_Entity" binding="basicHttpBinding"  />

    <endpoint name="ETL_EntitySvcTCP" address="" binding="netTcpBinding" contract="EABR.ServiceBus.ETL_Entity.IETL_Entity" />

    </service>

    </services>

    <behaviors>

    <serviceBehaviors>

    <behavior name="MEX">

    <serviceMetadata httpGetEnabled="True" />

    <serviceDebug includeExceptionDetailInFaults="true" />

    </behavior>

    </serviceBehaviors>

    </behaviors>

    </system.serviceModel>

    <appSettings>

    <add key="StringConexaoOra" value="Data Source=DESENV; User Id=wwapii; Password=wwapiiprod;Integrated Security=no;"/>

    <add key="ClientSettingsProvider.ServiceUri" value="" />

    </appSettings>

    <system.web>

    <membership defaultProvider="ClientAuthenticationMembershipProvider">

    <providers>

    <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />

    </providers>

    </membership>

    <roleManager defaultProvider="ClientRoleProvider" enabled="true">

    <providers>

    <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />

    </providers>

    </roleManager>

    </system.web>

    </configuration>

     

    E a aplicação precisa ser instalada como windows service para ter o suporte de NET TCP, não se esqueça de usar Net Crentials com um usuário de sistema valido em sua rede.

    terça-feira, 7 de junho de 2011 20:38
  • Boas Marcos,

    Sei que faz tempo, mas conseguiu resolver o problema?
    http://www.israelaece.com
    quarta-feira, 8 de junho de 2011 12:44
    Moderador
  • Sei que esse tópico é antigo, mas gostaria de registrar a solução que encontrei para o problema.

    Eu estava tendo o mesmo erro, porém estou usando o IIS, e para corrigir o problema é bem simples.

    Basta abrir o IIS, selecionar a sua aplicação e ir em Configurações Avançadas... Na janela que abrir vai ter uma configuração chamada "Protocolos Habilitados", nela deve estar escrito "http", basta por uma virgula e escrever "net.tcp", sendo assim o que deve estar escrito nessa opção é "http,net.tcp"

    Isso devera funcionar. Somente mais um lembrete, você não deve esquecer de habilitar o TCP na hora de instalar o IIS.

    Espero ter ajudado,

    Fernando Marostega

    • Sugerido como Resposta Nandoviski quarta-feira, 6 de fevereiro de 2013 12:03
    quarta-feira, 6 de fevereiro de 2013 12:03