Não foi possível encontrar o elemento de terminal padrão

Eu adicionei um proxy a um serviço da Web para uma solução VS2008 / .NET 3.5. Ao construir o cliente, o .NET lança este erro:

Não foi possível encontrar o elemento de terminal padrão que faz referência ao contrato ‘IMySOAPWebService’ na seção de configuração do cliente ServiceModel. Isso pode ter ocorrido porque nenhum arquivo de configuração foi localizado para seu aplicativo ou porque nenhum elemento de terminal correspondente a esse contrato pôde ser localizado no elemento do cliente.

Procurando por este erro me diz para usar o namespace completo no contrato. Aqui está o meu app.config com namespace completo:

   

Estou executando XP local (eu menciono isso porque um número de hits do Google menciona win2k3) O app.config é copiado para app.exe.config, então isso também não é o problema.

Alguma pista?

“Este erro pode surgir se você está chamando o serviço em uma biblioteca de classs e chamando a biblioteca de classs de outro projeto.”

Nesse caso, você precisará include as definições de configuração do WS nos principais projetos app.config se for um winapp ou web.config se for um aplicativo da web. Este é o caminho a percorrer, mesmo com o PRISM e o WPF / Silverlight.

Tendo testado várias opções, eu finalmente resolvi isso usando

contract = “IMySOAPWebService”

isto é, sem o namespace completo na configuração. Por algum motivo, o nome completo não resolveu corretamente

Eu resolvi isso (acho que outros podem ter sugerido) criando as próprias instâncias de endereço de binding e de terminal – porque eu não queria adicionar novas configurações aos arquivos de configuração (isso é um substituto para algum código de biblioteca existente que é usado amplamente, e usei anteriormente uma Referência de Serviço da Web mais antiga, etc.) e, por isso, queria poder include isso sem ter que adicionar novas configurações em todos os lugares.

 var remoteAddress = new System.ServiceModel.EndpointAddress(_webServiceUrl); using (var productService = new ProductClient(new System.ServiceModel.BasicHttpBinding(), remoteAddress)) { //set timeout productService.Endpoint.Binding.SendTimeout = new TimeSpan(0,0,0,_webServiceTimeout); //call web service method productResponse = productService.GetProducts(); } 

Editar

Se você estiver usando https, precisará usar BasicHttpsBinding vez de BasicHttpBinding .

Eu tive esse mesmo problema. Acontece que, para uma REFERÊNCIA da web, você precisa fornecer a URL como o primeiro parâmetro para o construtor:

 new WebService.WebServiceSoapClient("http://myservice.com/moo.aspx"); 

Para um novo estilo web SERVICE REFERENCE, você precisa fornecer um nome que se refira a uma input de terminal na configuração:

 new WebService.WebServiceSoapClient("WebServiceEndpoint"); 

Com uma input correspondente no Web.config ou no App.config :

     

Muito difícil de remover a visão do túnel “funcionou em um programa mais antigo” …

Eu tive uma situação como esta, onde eu tinha

  • Serviço WCF hospedado em algum lugar
  • Projeto Principal
  • Projeto de consumidor do tipo ‘biblioteca de classs’ que possui referência de serviço para um serviço WCF
  • Projeto principal chama methods de projeto de consumidor

Agora o projeto Consumer tinha toda a configuração relacionada no Tag do meu app.config, ele ainda estava lançando o mesmo erro que o anterior.

Tudo o que fiz foi adicionar a mesma tag ao arquivo app.config do meu projeto principal e, finalmente, estávamos prontos.

O problema real, no meu caso, era ler o arquivo de configuração errado. Em vez do app.config do consumidor, estava se referindo à configuração do proj principal. levei duas horas para descobrir isso.

“Este erro pode surgir se você está chamando o serviço em uma biblioteca de classs e chamando a biblioteca de classs de outro projeto.”

“Nesse caso, você precisará include as definições de configuração do WS nos principais projetos app.config se for um winapp ou web.config se for um aplicativo da Web. Esse é o caminho a percorrer, mesmo com o PRISM e o WPF / Silverlight.”

Sim, mas se você não puder alterar o projeto principal (Orchard CMS, por exemplo), poderá manter a configuração do serviço WCF em seu projeto.

Você precisa criar um auxiliar de serviço com o método de geração de clientes:

 public static class ServiceClientHelper { public static T GetClient(string moduleName) where T : IClientChannel { var channelType = typeof(T); var contractType = channelType.GetInterfaces().First(i => i.Namespace == channelType.Namespace); var contractAttribute = contractType.GetCustomAttributes(typeof(ServiceContractAttribute), false).First() as ServiceContractAttribute; if (contractAttribute == null) throw new Exception("contractAttribute not configured"); //path to your lib app.config (mark as "Copy Always" in properties) var configPath = HostingEnvironment.MapPath(String.Format("~/Modules/{0}/bin/{0}.dll.config", moduleName)); var configuration = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = configPath }, ConfigurationUserLevel.None); var serviceModelSectionGroup = ServiceModelSectionGroup.GetSectionGroup(configuration); if (serviceModelSectionGroup == null) throw new Exception("serviceModelSectionGroup not configured"); var endpoint = serviceModelSectionGroup.Client.Endpoints.OfType().First(e => e.Contract == contractAttribute.ConfigurationName); var channelFactory = new ConfigurationChannelFactory(endpoint.Name, configuration, null); var client = channelFactory.CreateChannel(); return client; } } 

e usá-lo:

 using (var client = ServiceClientHelper.GetClient(yourLibName)) { ... get data from service ... } 

Veja detalhes neste artigo .

Este me deixou louco.

Estou usando o Silverlight 3 Prism (CAB) com o WCF

Quando eu chamo um serviço WCF em um módulo Prism, recebo o mesmo erro:

Não foi possível encontrar o elemento de terminal padrão que faz referência ao contrato ‘IMyService’ na seção de configuração do cliente do modelo de serviço. Isso pode ter ocorrido porque nenhum arquivo de configuração foi localizado para seu aplicativo ou porque nenhum elemento de terminal correspondente a esse contrato pôde ser localizado no elemento client

Acontece que está procurando no arquivo .xap do Shell um arquivo ServiceReferences.ClientConfig, não no arquivo ServiceReferences.ClientConfig do módulo. Eu adicionei meu terminal e binding ao arquivo ServiceReferences.ClientConfig existente no meu aplicativo do Silverlight Shell (ele chama seus próprios serviços WCF).

Então eu tive que reconstruir o aplicativo Shell para gerar o novo arquivo .xap para a pasta ClientBin do meu projeto da Web.

Agora esta linha de código finalmente funciona:

 MyServiceClient myService = new MyServiceClient(); 

Eu estava recebendo esse erro dentro de um aplicativo ASP.NET onde o serviço WCF tinha sido adicionado a uma biblioteca de classs que está sendo adicionada ao aplicativo ASP.NET como um arquivo .dll referenciado na pasta bin. Para resolver o erro, as configurações no arquivo app.config da biblioteca de classs que fazem referência ao serviço WCF precisavam ser copiadas para as configurações web.config do site / aplicativo ASP.NET.

Eu encontrei (como copiar para App.config da interface do usuário do cliente como eu estava usando uma interface de biblioteca de classs) Eu tive que prefixar o nome da binding com o nome da referência de serviço (o meu é ServiceReference no abaixo).

por exemplo:

  

em vez do padrão gerado:

  

Eu tive o mesmo problema, mas mudar o namespace do contrato não funcionou para mim. Então tentei uma referência da Web estilo .Net 2 em vez de uma referência de serviço .Net 3.5. Isso funcionou.

Para usar uma referência da Web no Visual Studio 2008, clique em ‘Adicionar referência de serviço’ e clique em ‘Avançado’ quando a checkbox de diálogo for exibida. Em que você encontrará uma opção que permitirá que você use uma referência da Web em vez de uma referência de serviço.

Várias respostas aqui acertam na solução correta quando você está enfrentando o erro obscuro e mental de referenciar o serviço a partir de um arquivo de class: copie as informações de configuração do serviço no seu app.config web.config do seu console ou aplicativo windows. Nenhuma dessas respostas parece mostrar o que copiar. Vamos tentar corrigir isso.

Aqui está o que copiei do arquivo de configuração da minha biblioteca de classs, no arquivo de configuração do meu aplicativo de console, para contornar esse erro maluco de um serviço que eu escrevo chamado “TranslationServiceOutbound”.

Você basicamente quer tudo dentro da seção system.serviceModel :

           

Unidade testando um aplicativo não-biblioteca que consome um serviço pode causar esse problema.

As informações que outras pessoas inseriram abordam a causa raiz disso. Se você estiver tentando escrever casos de teste automatizados e a unidade que está testando realmente chamar a interface de serviço, será necessário include a referência de serviço no projeto de teste. Este é um sabor do aplicativo usando o tipo de biblioteca de erro. Eu não percebi isso imediatamente porque meu código que consome a interface não está em uma biblioteca . No entanto, quando o teste for executado, ele será executado a partir do conjunto de teste, não do conjunto em teste.

Adicionar uma referência de serviço ao projeto de teste de unidade resolveu meu problema.

Eu tenho uma situação que no teste de unidade. Eu copiei o arquivo app.config para o projeto de teste de unidade. Portanto, o projeto de teste de unidade também contém informações de terminal.

Eu enfrentei esse problema uma vez. Foi porque eu ainda estava desenvolvendo a interface que usa o serviço WCF. Eu configurei o aplicativo de teste e o desenvolvimento contínuo. Em seguida, em desenvolvimento, alterei alguns dos namespaces dos serviços. Então eu verifiquei duas vezes “system.serviceModel -> client -> endpoint -> contract” no web.config para coincidir com a class WCF. Então o problema está resolvido.

O namespace em sua configuração deve refletir o restante do caminho do namespace após o namespace padrão do seu cliente (conforme configurado nas propriedades do projeto). Com base na sua resposta postada, meu palpite é que seu cliente está configurado para estar no namespace “Fusion.DataExchange.Workflows”. Se você movesse o código do cliente para outro namespace, seria necessário atualizar a configuração para corresponder ao caminho restante do namespace.

Apenas para qualquer outra pessoa com o mesmo problema; Eu escrevi um teste de unidade para o meu método que tentou se conectar ao meu serviço. Ele falhou com a mesma exceção toda vez – não tenho idéia do motivo. Quando eu corri de um winform ele funciona bem.

Eu tenho um mesmo problema.Eu sou usado o serviço WCF na biblioteca de class e chamando a biblioteca de classs do Windows Application project.but Eu sou Forget Change No arquivo de configuração do aplicativo do Windows Projeto mesmo o do arquivo app.Config da biblioteca de classs.
solução: change Configuração do projeto externo igual à configuração wcf da biblioteca de classs.

Se você fizer referência ao serviço da Web na sua biblioteca de classs, precisará copiar o app.config para o aplicativo do Windows ou o aplicativo de console

solução: change Configuração do projeto externo igual à configuração wcf da biblioteca de classs.

Trabalhou para mim

Oi eu encontrei o mesmo problema, mas a melhor solução é deixar o .NET para configurar sua configuração do lado do cliente. O que eu descubro é isso quando eu adiciono uma referência de serviço com uma string de consulta de http: /namespace/service.svc? Wsdl = wsdl0 ele NÃO cria um endpoint de configuração no lado do cliente. Mas quando eu removo o? Wsdl-wsdl0 e uso apenas a URL http: /namespace/service.svc, ele cria a configuração do terminal no arquivo de configuração do cliente. por pouco remoe o “? WSDL = WSDL0”.

Não coloque a linha de declaração do cliente de serviço como campo de class, em vez disso, crie uma instância em cada método usado. Assim, o problema será corrigido. Se você criar a instância do cliente de serviço como campo de class, ocorrerá um erro de tempo de design!

Caso você esteja usando o aplicativo WPF usando a estrutura PRISM, a configuração deve existir em seu projeto de boot (isto é, no projeto onde seu bootstrapper reside).

Esse erro pode surgir se você estiver chamando o serviço em uma biblioteca de classs e chamando a biblioteca de classs de outro projeto.

Parece haver várias maneiras de criar / corrigir esse problema. Para mim, o produto CRM que estou usando foi escrito em código nativo e é capaz de chamar minha dll do .NET, mas me deparo com as informações de configuração que precisam estar no / acima do aplicativo principal. Para mim, o aplicativo CRM não é .NET, então acabei tendo que colocá-lo no meu arquivo machine.config (não onde eu quero). Além disso, como minha empresa usa o Websense, tive dificuldade em adicionar a Referência de Serviço devido a um problema de Autenticação Obrigatória do 407, que exigia uma modificação no machine.cong.

Solução de proxy:

Para obter o WCF Service Reference para trabalhar, tive que copiar as informações do app.config da minha DLL para a configuração principal do aplicativo (mas para mim era o machine.config). E eu também tive que copiar as informações do endpoint para o mesmo arquivo. Uma vez que fiz isso, comecei a trabalhar para mim.

Está bem. Meu caso foi um pouco diferente, mas finalmente eu encontrei a correção para isso: Eu tenho um Console.EXE -> DLL -> Invocando WS1 -> DLL -> Invocando WS2

Eu tive ambas as configurações do modelo de serviço do WS1 e WS2 no Console.EXE.config conforme recomendado. – não resolveu o problema.

Mas ainda não funcionou, até que eu adicionei a WebReference do WS2 ao WS1 também e não apenas à DLL que realmente criava e invocava o proxy do WS2.

Eu tive o mesmo problema
Eu estava usando o aplicativo de desktop e usando o serviço Global Weather Web

Excluí a referência de serviço e adicionei a referência da web e o problema resolvido Obrigado

A solução para mim foi remover o nome do terminal do atributo Nome do Nó de Extremidade no cliente web.config que permitia que o proxy usasse

 ChannelFactory _channelFactory = new ChannelFactory(""); 

só levou o dia todo para malhar. Além disso, o nome do contrato estava errado quando essa correção estava em vigor, embora estivesse errado quando o erro inicial apareceu. Duplo, em seguida, verificação tripla para o nome do contrato amarra as pessoas !! attrib: Ian

Permita-me adicionar mais uma coisa para procurar. ( A resposta de Tom Haigh já faz alusão a isso, mas eu quero ser explícito)

Meu arquivo web.config tinha o seguinte definido:

    

Eu já estava usando basicHttpsBinding para uma referência, mas depois adicionei uma nova referência que exigia basicHttpBinding (no s). Tudo o que tive que fazer foi adicionar isso ao meu protocolMapping seguinte maneira:

     

Como LR corretamente aponta, isso precisa ser definido nos lugares certos. Para mim, isso significava um no app.config do meu projeto de teste de unidade, bem como um no web.config do projeto de serviço principal.

Eu tive esse erro quando eu estava fazendo referência ao contrato no elemento de arquivo de configuração sem o operador de escopo global.

ou seja

  

funciona, mas

  

fornece o erro “Não foi possível encontrar o elemento de terminal padrão que referencia o contrato”.

O assembly contendo MyNamepsace.IMyContract está em um assembly diferente para o aplicativo principal, portanto, isso pode explicar a necessidade de usar a resolução de escopo global.

Eu recebi o mesmo erro e tentei muitas coisas, mas não funcionou, então notei que meu “contrato” não era o mesmo para projetos inteiros, eu mudei o contrato como seria o mesmo para todos os projetos dentro da solução e do que funcionava. Este é o projeto A

    

Projeto B:

    

Finalmente mudei para ambos como:

    

Quando você está adicionando uma referência de serviço

insira a descrição da imagem aqui

Cuidado com o namespace em que você está digitando:

insira a descrição da imagem aqui

Você deve anexá-lo ao nome da sua interface: