Usuário com melhor resposta
WCF netTcpBinding, wsHttpBinding e Restfull

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
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
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 -
-
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
<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="HttpServiceBindingConfig" behaviorConfiguration="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'.
-------------------------------------------------------------------------------- -
-
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 -
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: TChannelErro 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 -
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
-
-
-
-
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