none
WCF netTcpBinding, wsHttpBinding e Restfull RRS feed

  • Pergunta

  • Boa Tarde,

    estou tentando criar o mesmo serviço WCF para que rode o mesmo serviço com EndPoints diferentes.

    1. Instalei o Starter Kit WCF para facilitar o funcionamento do Restfull.
    2. Criei um arquivo ProdutoService.svc e outro RestService.svc
    3. O arquivo ProdutoService.svc tem o seguinte código:

    <%@ ServiceHost Language="C#" Debug="true" Service="PoliticaVendas.Business.ProdutoFacade" %>

    4. O arquivo RestService.svc tem o seguinte código:

    @ ServiceHost Language="C#" Debug="true" Service="PoliticaVendas.Business.ProdutoFacade"
             Factory="Microsoft.ServiceModel.Web.WebServiceHost2Factory" %>

    5. Configurei dois EndPoints para netTcpBinding e wsHttpBinding, ambos com o EndPoint MEX.

    Quando tento acessar o RestService.svc ocorre o erro:

    O tipo de canal especificado System.ServiceModel.Channels.IReplyChannel não é suportado por este gerenciador de canal.
    Nome do parâmetro: TChannel

    Se removo os 2 EndPoints, o Restfull funciona normalmente.

    Alguém tem idéia do que pode estar acontecendo??

    Abraços,
    Marcel Piva

     


    Marcel Piva

     

    <%

    • Editado Piva, Marcel quinta-feira, 17 de setembro de 2009 20:09
    quinta-feira, 17 de setembro de 2009 19:49

Respostas

  • Boas Marcel,

    Se eu entendi bem, você tem apenas um único serviço, mas tem dois arquivos *.svc que, internamente, aponta para a mesma classe do serviço. Eu simulei aqui (sem o endpoint TCP/WAS). Criei dois arquivos *.svc, apontando para o mesmo serviço, e consegui acessar via REST e via WSHttpBinding.

    [ProdutoService.svc]
    <%@ ServiceHost
        Language="C#"
        Debug="true"
        Service="ProdutoService"
        CodeBehind="~/App_Code/ProdutoService.cs" %>

    [RestService.svc]
    <%@ ServiceHost
        Language="C#"
        Debug="true"
        Service="ProdutoService"
        CodeBehind="~/App_Code/ProdutoService.cs"
        Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

    E, finalmente, o arquivo de configuração:

    <system.serviceModel>
      <services>
        <service behaviorConfiguration="ServiceBehavior" name="ProdutoService">
          <endpoint address="ProdutoService" binding="wsHttpBinding" contract="IProdutoService" />
          <endpoint address="RestService" binding="webHttpBinding" contract="IProdutoService" />
          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
      </services>
      <behaviors>
        <serviceBehaviors>
          <behavior name="ServiceBehavior">
            <serviceMetadata httpGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="true" />
          </behavior>
        </serviceBehaviors>
      </behaviors>
    </system.serviceModel>
    http://www.israelaece.com
    • Marcado como Resposta Piva, Marcel terça-feira, 22 de setembro de 2009 13:11
    sexta-feira, 18 de setembro de 2009 01:52
    Moderador

Todas as Respostas

  • Boas Marcel,

    Como está a configuração do Binding para o serviço REST? Você deve utilizar o binding WebHttpBinding para serviços REST.
    http://www.israelaece.com
    quinta-feira, 17 de setembro de 2009 20:03
    Moderador
  • Alô Marcel,

    Você poderia também mandar a stack trace do erro que você encontra quando tenta acessar RestService.svc?
    quinta-feira, 17 de setembro de 2009 20:09
  •  

     

    Uma instância de ligação já foi associada para escutar o URI 'http://localhost/PoliticaVendasService/ProdutoService.svc'. Se dois pontos de extremidade quiserem compartilhar o mesmo ListenUri, também deverão compartilhar a mesma instância de objeto de ligação. Os dois pontos de extremidade conflitantes foram especificados em chamadas AddServiceEndpoint(), em um arquivo de configuração ou em uma combinação de AddServiceEndpoint() e configuração.
    Descrição: Ocorreu uma exceção não tratada durante a execução da atual solicitação da Web. Examine o rastreamento de pilha para obter mais informações sobre o erro e onde foi originado no código.

    Detalhes da Exceção: System.InvalidOperationException: Uma instância de ligação já foi associada para escutar o URI 'http://localhost/PoliticaVendasService/ProdutoService.svc'. Se dois pontos de extremidade quiserem compartilhar o mesmo ListenUri, também deverão compartilhar a mesma instância de objeto de ligação. Os dois pontos de extremidade conflitantes foram especificados em chamadas AddServiceEndpoint(), em um arquivo de configuração ou em uma combinação de AddServiceEndpoint() e configuração.

    Erro de Origem:

    Exceção não tratada foi gerada durante a execução da atual solicitação da Web. As informações relacionadas à origem e ao local da exceção podem ser identificadas usando-se o rastreamento de pilha de exceção abaixo. 

    Rastreamento de Pilha:


    [InvalidOperationException: Uma instância de ligação já foi associada para escutar o URI 'http://localhost/PoliticaVendasService/ProdutoService.svc'. Se dois pontos de extremidade quiserem compartilhar o mesmo ListenUri, também deverão compartilhar a mesma instância de objeto de ligação. Os dois pontos de extremidade conflitantes foram especificados em chamadas AddServiceEndpoint(), em um arquivo de configuração ou em uma combinação de AddServiceEndpoint() e configuração. ]
       System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost) +1814
       System.ServiceModel.ServiceHostBase.InitializeRuntime() +37
       System.ServiceModel.ServiceHostBase.OnBeginOpen() +27
       System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) +49
       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 '/PoliticaVendasService/RESTService.svc' devido a uma exceção durante a compilação. A mensagem de exceção é: Uma instância de ligação já foi associada para escutar o URI 'http://localhost/PoliticaVendasService/ProdutoService.svc'. Se dois pontos de extremidade quiserem compartilhar o mesmo ListenUri, também deverão compartilhar a mesma instância de objeto de ligação. Os dois pontos de extremidade conflitantes foram especificados em chamadas AddServiceEndpoint(), em um arquivo de configuração ou em uma combinação de AddServiceEndpoint() e configuração. .]
       System.ServiceModel.AsyncResult.End(IAsyncResult result) +11527194
       System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +194
       System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, Boolean flowContext) +176
       System.ServiceModel.Activation.HttpHandler.ProcessRequest(HttpContext context) +23
       System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
       System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

     
    Como disse antes, se eu remover todos os EndPoints, o REST funciona.
    []s

    <behaviors>
        <
    serviceBehaviors>
            <
    behavior name="ServiceBehavior">
                <
    serviceMetadata httpGetEnabled="true" />
                <
    serviceDebug includeExceptionDetailInFaults="true" />
                <
    serviceCredentials>
                    <
    serviceCertificate
                        findValue="tempCert"
                        x509FindType="FindBySubjectName"
                        storeName="My"
                        storeLocation="LocalMachine" />
                    <
    userNameAuthentication
                        userNamePasswordValidationMode="Custom"
                        customUserNamePasswordValidatorType="Framework.Security.MyAuthentication, Framework.WcfProxy.MySecurity" />
                </
    serviceCredentials>
            </
    behavior>
        </
    serviceBehaviors>
        <
    endpointBehaviors>
            <
    behavior name="RestService">
                <
    webHttp/>
            </
    behavior>
        </
    endpointBehaviors>
    </
    behaviors>

    <bindings>
        <
    webHttpBinding>
            <
    binding name="HttpServiceBindingConfig">
                <
    security mode="None">
                    <
    transport proxyCredentialType="None"/>
                </
    security>
            </
    binding>
        </
    webHttpBinding>
        <
    netTcpBinding>
            <
    binding name="TcpServiceBindingConfig">
                <
    security mode="Message">
                    <
    message clientCredentialType="UserName" />
                    <
    transport clientCredentialType="None" protectionLevel="None" />
                </
    security>
            </
    binding>
        </
    netTcpBinding>
        <
    wsHttpBinding>
            <
    binding name="WsServiceBindingConfig">
                <
    security mode="Message">
                    <
    message clientCredentialType="UserName" />
                    <
    transport clientCredentialType="None" proxyCredentialType="None" />
                </
    security>
            </
    binding>
        </
    wsHttpBinding>
    </
    bindings>
    <services>
        <
    service behaviorConfiguration="ServiceBehavior" name="PoliticaVendas.Business.ProdutoFacade">
            <!--
    webHttpBinding-->
            <
    endpoint address="http://localhost/PoliticaVendasService/ProdutoService.svc" binding="webHttpBinding"
                bindingConfiguration="HttpServiceBindingConfigbehaviorConfiguration="RestService
                contract="PoliticaVendas.Services.Contracts.IProdutoServiceContract" />
            <!--
    wsHttpBinding--> 
            <
    endpoint address="http://localhost/PoliticaVendasService/ProdutoService.svc" binding="wsHttpBinding" 
                bindingConfiguration
    ="WsServiceBindingConfig"
                contract="PoliticaVendas.Services.Contracts.IProdutoServiceContract" />
            <
    endpoint address="http://localhost/PoliticaVendasService/ProdutoService.svc/mex" binding="mexHttpBinding" bindingConfiguration=""
                contract="IMetadataExchange" />
            <!--
    netTcpBinding--> 
            <
    endpoint address="net.tcp://localhost:808/PoliticaVendasService/ProdutoService.svc" binding="netTcpBinding"
                bindingConfiguration="TcpServiceBindingConfig"
                contract="PoliticaVendas.Services.Contracts.IProdutoServiceContract" />
            <
    endpoint address="net.tcp://localhost:808/PoliticaVendasService/ProdutoService.svc/mex" binding="mexTcpBinding" 
                contract
    ="IMetadataExchange" />
        </
    service>
    </
    services>



    O erro retornado agora é:

    Erro de Servidor no Aplicativo '/PoliticaVendasService'.
    --------------------------------------------------------------------------------
    quinta-feira, 17 de setembro de 2009 20:20
  • Carlos, segue o StackTrace na resposta ao Israel.

    []s
    Marcel Piva
    quinta-feira, 17 de setembro de 2009 20:21
  • Boas Marcel,

    O teu endpoint configurado com webHttpBinding, não deveria apontar para o arquivo RestService.svc?

    Outro detalhe: você está hospedando via TCP? Está utilizando WAS?
    http://www.israelaece.com
    quinta-feira, 17 de setembro de 2009 21:01
    Moderador
  • Exato, fiz a correção, apontando para o RestService.svc, é que havia retirado o código, e inseri novamente para disparar o erro.

    Sim, estou utilizando WAS.

    O que acho muito estranho é: Se  remover os EndPoints de TCP e WS, funciona!!!





    O erro atual agora é:

    Erro de Servidor no Aplicativo '/PoliticaVendasService'.
    --------------------------------------------------------------------------------

    O tipo de canal especificado System.ServiceModel.Channels.IReplyChannel não é suportado por este gerenciador de canal.
    Nome do parâmetro: TChannel
    Descrição: Ocorreu uma exceção não tratada durante a execução da atual solicitação da Web. Examine o rastreamento de pilha para obter mais informações sobre o erro e onde foi originado no código.

    Detalhes da Exceção: System.ArgumentException: O tipo de canal especificado System.ServiceModel.Channels.IReplyChannel não é suportado por este gerenciador de canal.
    Nome do parâmetro: TChannel

    Erro de Origem:

    Exceção não tratada foi gerada durante a execução da atual solicitação da Web. As informações relacionadas à origem e ao local da exceção podem ser identificadas usando-se o rastreamento de pilha de exceção abaixo. 

    Rastreamento de Pilha:


    [ArgumentException: O tipo de canal especificado System.ServiceModel.Channels.IReplyChannel não é suportado por este gerenciador de canal.
    Nome do parâmetro: TChannel]
       System.ServiceModel.Channels.TransactionFlowBindingElement.BuildChannelListener(BindingContext context) +11477483
       System.ServiceModel.Channels.BindingContext.BuildInnerChannelListener() +66
       Microsoft.ServiceModel.Web.RequestInterceptorReplyChannelListener..ctor(BindingContext c, Collection`1 interceptors) in d:\dd\SP_1\src\ndp\cdf\src\hilo\stagingCodeplex-R2\Microsoft.ServiceModel.Web\Microsoft.ServiceModel.Web\RequestInterceptorBindingElement.cs:180
       Microsoft.ServiceModel.Web.RequestInterceptorBindingElement.BuildChannelListener(BindingContext context) in d:\dd\SP_1\src\ndp\cdf\src\hilo\stagingCodeplex-R2\Microsoft.ServiceModel.Web\Microsoft.ServiceModel.Web\RequestInterceptorBindingElement.cs:62
       System.ServiceModel.Channels.BindingContext.BuildInnerChannelListener() +66
       System.ServiceModel.Channels.Binding.BuildChannelListener(Uri listenUriBaseAddress, String listenUriRelativeAddress, ListenUriMode listenUriMode, BindingParameterCollection parameters) +124
       System.ServiceModel.Description.DispatcherBuilder.MaybeCreateListener(Boolean actuallyCreate, Type[] supportedChannels, Binding binding, BindingParameterCollection parameters, Uri listenUriBaseAddress, String listenUriRelativeAddress, ListenUriMode listenUriMode, ServiceThrottle throttle, IChannelListener& result, Boolean supportContextSession) +337
       System.ServiceModel.Description.DispatcherBuilder.BuildChannelListener(StuffPerListenUriInfo stuff, ServiceHostBase serviceHost, Uri listenUri, ListenUriMode listenUriMode, Boolean supportContextSession, IChannelListener& result) +647
       System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost) +1364
       System.ServiceModel.ServiceHostBase.InitializeRuntime() +37
       System.ServiceModel.ServiceHostBase.OnBeginOpen() +27
       System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) +49
       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 '/PoliticaVendasService/RESTService.svc' devido a uma exceção durante a compilação. A mensagem de exceção é: O tipo de canal especificado System.ServiceModel.Channels.IReplyChannel não é suportado por este gerenciador de canal.
    Nome do parâmetro: TChannel.]
       System.ServiceModel.AsyncResult.End(IAsyncResult result) +11527194
       System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +194
       System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, Boolean flowContext) +176
       System.ServiceModel.Activation.HttpHandler.ProcessRequest(HttpContext context) +23
       System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
       System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
    --------------------------------------------------------------------------------
    Informações sobre a Versão: Microsoft .NET Framework Versão:2.0.50727.3053; Versão do ASP.NET:2.0.50727.3053



    []s


    Marcel Piva
    quinta-feira, 17 de setembro de 2009 21:14
  • Boas Marcel,

    Se eu entendi bem, você tem apenas um único serviço, mas tem dois arquivos *.svc que, internamente, aponta para a mesma classe do serviço. Eu simulei aqui (sem o endpoint TCP/WAS). Criei dois arquivos *.svc, apontando para o mesmo serviço, e consegui acessar via REST e via WSHttpBinding.

    [ProdutoService.svc]
    <%@ ServiceHost
        Language="C#"
        Debug="true"
        Service="ProdutoService"
        CodeBehind="~/App_Code/ProdutoService.cs" %>

    [RestService.svc]
    <%@ ServiceHost
        Language="C#"
        Debug="true"
        Service="ProdutoService"
        CodeBehind="~/App_Code/ProdutoService.cs"
        Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

    E, finalmente, o arquivo de configuração:

    <system.serviceModel>
      <services>
        <service behaviorConfiguration="ServiceBehavior" name="ProdutoService">
          <endpoint address="ProdutoService" binding="wsHttpBinding" contract="IProdutoService" />
          <endpoint address="RestService" binding="webHttpBinding" contract="IProdutoService" />
          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
      </services>
      <behaviors>
        <serviceBehaviors>
          <behavior name="ServiceBehavior">
            <serviceMetadata httpGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="true" />
          </behavior>
        </serviceBehaviors>
      </behaviors>
    </system.serviceModel>
    http://www.israelaece.com
    • Marcado como Resposta Piva, Marcel terça-feira, 22 de setembro de 2009 13:11
    sexta-feira, 18 de setembro de 2009 01:52
    Moderador
  • Legal Israel,

    poderia me mandar a solução zipada?

    []s
    Marcel Piva

    Marcel Piva
    sexta-feira, 18 de setembro de 2009 02:10
  • Boas Marcel,

    Me passe seu e-mail. Certifique-se de que ele aceite zip/rar.


    http://www.israelaece.com
    sexta-feira, 18 de setembro de 2009 10:47
    Moderador

  • Opa Laercio,

    o e-mail é: eu@marcelpiva.com

    []s

    Marcel Piva
    sábado, 19 de setembro de 2009 21:34
  • Israel, agora tudo certo!!

    Estava utilizando a classe (Microsoft.ServiceModel.Web.WebServiceHost2Factory) que me fornecia um /help no REST, se me lembro bem fiz download no codeplex, porém a mesma estava me resultando em problemas. Não havia testado com a classe Factory nativa do .NET, e esta sim realmente funciona sem problemas.

    Simplesmente alterei o Factory do arquivo RestService.svc e por enquanto tudo funcionando .

    Obrigado pela força.
    []s


    Marcel Piva
    terça-feira, 22 de setembro de 2009 13:15