InvalidOperationException ao criar instância de serviço web WCF
-
09-06-2019 - |
Pergunta
Eu tenho um serviço Web WCF que é referenciado em uma biblioteca de classes.Após a execução do projeto, ao criar o objeto cliente de serviço de dentro de uma biblioteca de classes, recebo uma InvalidOperationException com a mensagem:
Não foi possível encontrar o elemento de endpoint padrão que referências contrate 'myServiceReference.imyserveice' na seção de configuração do cliente ServiceModel.Isso pode ocorrer porque nenhum arquivo de configuração foi encontrado para o seu aplicativo ou porque nenhum elemento de endpoint correspondente a este contrato pode ser encontrado no elemento do cliente.
O código que estou usando para criar a instância é:
myServiceClient = new MyServiceClient();
de onde MyServiceClient herda
System.ServiceModel.ClientBase
Como faço para resolver isso?
Observação:Eu tenho um aplicativo de console separado que simplesmente cria o mesmo objeto de serviço e faz chamadas para ele e funciona sem problemas.
Solução
Aqui está meu arquivo app.config da biblioteca de classes:
Você deve colocar essas configurações no arquivo de configuração do aplicativo principal.O aplicativo .NET (que está chamando sua biblioteca de classes) usa dados de seu próprio arquivo de configuração e não do arquivo de configuração de sua biblioteca.
Outras dicas
Ou você pode definir o endpoint em seu código:
http://msdn.microsoft.com/en-us/library/ms731862.aspx
BasicHttpBinding binding = new BasicHttpBinding();
EndpointAddress address = new EndpointAddress("http://url-to-service/");
// Create a client that is configured with this address and binding.
MyServiceClient client = new MyServiceClient(binding, address);
Eu tive um caso semelhante.Eu tinha uma biblioteca de classes que chamava um serviço da web, depois um .EXE que chamava o .DLL da biblioteca de classes.Acho que é o arquivo de configuração do .EXE que é usado e não o da configuração do .DLL.
Mas, como Richard disse acima, tive que qualificar totalmente o namespace.É um pouco doloroso.Abaixo está exatamente o que eu mudei.A dor é que eu tive que alterá -lo em dois lugares, um na referência.cs que é gerado quando você cria uma referência de serviço e a outra no arquivo de configuração.Assim, toda vez que eu mudo o web service e faço uma "Referência de Atualização" tenho que fazer a alteração no código C# novamente.
1) Na verdade, você deve alterar o ConfigurationName no reference.cs da seguinte maneira:
De: [System.ServiceModel.ServiceContractAttribute(Namespace = "http://TFBIC.RCT.BizTalk.Orchestrations", ConfigurationName = " RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations")]
Para: [System.ServiceModel.ServiceContractAttribute(Namespace = "http://TFBIC.RCT.BizTalk.Orchestrations", ConfigurationName = "TFBIC.RCT.HIP.Components.RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations")]
2) e também altere o valor “contrato” em todos os app.config relacionados (para .dll e .exe) da seguinte forma:
De:
<endereço do terminal=http://nxwtest08bt1.dev.txfb-ins.com/TFBIC.RCT.BizTalk.Orchestrations/WcfService_TFBIC_RCT_BizTalk_Orchestrations.svcbinding = "wshttpbinding" bindingConfiguration = "wshttpbinding_itwowayasync" contrat = "rctwebservice.wcfservice_tfbic_rct_biztalk_orchestrations" = "wshttpinding_itwayasynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynynY
Para:
<endereço do terminal=http://nxwtest08bt1.dev.txfb-ins.com/TFBIC.RCT.BizTalk.Orchestrations/WcfService_TFBIC_RCT_BizTalk_Orchestrations.svcbinding = "wshtpbinding" bindingConfiguration = "wshttpbinding_itwowayasync" contrat = "tfbic.rct.hip.comPONENTS.RCTWEBSVICE.WCFSERVICE_TFBIC_RCT_BIZTALK_ORCHESTATIONSTAÇÕES ="
Só para ficar claro: como eu sabia qual era o namespace completo?O namespace do programa era TFBIC.RCT.HIP.Dentro disso, o código C# possui uma instrução adicional de namespace:
namespace RCTHipComponents
Provavelmente ajudaria se você postasse seu arquivo app.config, já que esse tipo de erro tende a apontar para um problema no <endpoint>
bloquear.Certifique-se de que o atributo do contrato pareça adequado para você.
Editar:Tente qualificar totalmente o valor do seu contrato;use o namespace completo.Eu acho que isso é necessário.