Erro WCF - Não foi possível encontrar o elemento de endpoint padrão que faz referência ao contrato 'UserService.UserService'

98

Alguma ideia de como consertar isso?

UserService.UserServiceClient userServiceClient = new UserServiceClient();
            userServiceClient.GetUsersCompleted += new EventHandler<GetUsersCompletedEventArgs>(userServiceClient_GetUsersCompleted);
            userServiceClient.GetUsersAsync(searchString);

.

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_UserService" 
                     maxBufferSize="2147483647" 
                     maxReceivedMessageSize="2147483647">
                <security mode="None" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:52185/UserService.svc" 
                  binding="basicHttpBinding" 
                  bindingConfiguration="BasicHttpBinding_UserService" 
                  contract="UserService.UserService"
                  name="BasicHttpBinding_UserService" />
    </client>
    <behaviors>
        <serviceBehaviors>
            <behavior name="Shell.Silverlight.Web.Service3Behavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <services>
        <service behaviorConfiguration="Shell.Silverlight.Web.Service3Behavior" 
                 name="Shell.Silverlight.Web.Service3">
            <endpoint address="" 
                      binding="basicHttpBinding" 
                      contract="Shell.Silverlight.Web.Service3" />
            <endpoint address="mex" 
                      binding="mexHttpBinding" 
                      contract="IMetadataExchange" />
        </service>
    </services>
</system.serviceModel>

Não foi possível encontrar o elemento de terminal padrão que faz referência ao contrato 'UserService.UserService' na seção de configuração do cliente ServiceModel. Isso pode ser porque nenhum arquivo de configuração foi localizado para seu aplicativo ou porque nenhum elemento de terminal correspondente a este contrato foi encontrado no elemento cliente.

Resolvido!

Não mencionei que se tratava de um aplicativo Silverlight. Eu tinha a referência wcf em uma DLL que tinha seu próprio arquivo "ServiceReferences.ClientConfig". Mudei o conteúdo de ServiceReferences.ClientConfig da DLL para o projeto silverlight principal e funcionou.

NotDan
fonte
e se o aplicativo que executa a DLL for de terceiros, por exemplo, a DLL é um plugin para outro aplicativo?
Stefanos Kargas

Respostas:

186

Eu tive um problema com o mesmo. Meu aplicativo também era um aplicativo Silverlight e o serviço estava sendo chamado de uma biblioteca de classes com um UserControl personalizado que estava sendo usado nele.

A solução é simples. Copie as definições do terminal do arquivo de configuração (por exemplo, ServiceReferences.ClientConfig) da biblioteca de classes para o arquivo de configuração do aplicativo silverlight. Eu sei que você esperaria que funcionasse sem ter que fazer isso, mas aparentemente alguém em Redmond tirou férias naquele dia.

sprite
fonte
50
Esta solução é válida para projetos ASP.NET e MVC também. Se você adicionar o serviço a uma Biblioteca de Classes, ele não funcionará, pegue a seção system.serviceModel do app.config em seu projeto de biblioteca e coloque-o em seu web.config.
Adam Pope
5
Parece que isso é verdade para qualquer tipo de projeto, eu estava usando quartz.net como serviço do Windows e tinha um trabalho em uma montagem diferente que fazia referência ao serviço da web. Funcionou para mim também. THX.
tiagoleita
2
Olá, também funcionou para um projeto do Windows Phone. Como @thiagoleite diz, parece que está funcionando para a maioria dos tipos de projeto.
Thanushka
3
1 para a piada de férias de Redmond ... De qualquer forma, há uma maneira de adicioná-lo como um arquivo externo em vez de brincar com o web.config?
Shimmy Weitzhandler
1
@sprite Acabei definindo minhas configurações obrigatórias no código (substituí o construtor do cliente), conforme a resposta de Vishal . Dessa forma, ele é enviado através dos conjuntos. Obrigado!
Shimmy Weitzhandler de
45

Você também pode definir esses valores programaticamente na biblioteca de classes, o que evitará o movimento desnecessário dos arquivos de configuração pela biblioteca. O código de exemplo para BasciHttpBinding simples é -

BasicHttpBinding basicHttpbinding = new BasicHttpBinding(BasicHttpSecurityMode.None);
basicHttpbinding.Name = "BasicHttpBinding_YourName";
basicHttpbinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
basicHttpbinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;

EndpointAddress endpointAddress = new EndpointAddress("http://<Your machine>/Service1/Service1.svc");
Service1Client proxyClient = new Service1Client(basicHttpbinding,endpointAddress);
Vishal
fonte
@wooncherk, minha biblioteca de classes tem apenas uma referência a um wsdl. Onde devo colocar este código? Eu a construo em uma dll C # e coloco a dll em meus arquivos de aplicativo, onde faço referência a partir do IronPython. Obrigado
Срба
12

Apenas no caso de alguém ter o mesmo problema ao usar WPF (em vez de WCF ou Silverlight):

Tive esse erro, ao conectar a um Web Service. Quando meu código estava na solução de aplicativo WPF "principal", sem problemas, funcionou perfeitamente. Mas quando eu movia o código para a solução de camada DAL mais sensata, isso geraria a exceção.

Não foi possível encontrar o elemento de endpoint padrão que faz referência ao contrato 'MyWebService.MyServiceSoap' na seção de configuração do cliente ServiceModel. Isso pode ser porque nenhum arquivo de configuração foi localizado para seu aplicativo ou porque nenhum elemento de terminal correspondente a este contrato foi encontrado no elemento cliente.

Como foi afirmado por "Sprite" neste tópico, você precisa copiar a tag manualmente.

Para aplicativos WPF, isso significa copiar a tag do app.config em minha solução DAL para app.config na solução de aplicativo WPF principal.

Mike Gledhill
fonte
isso é ótimo, mas seria melhor como um breve comentário sob minha própria resposta, assim como "Adam Pope" fez. Seria lido por muito mais pessoas.
sprite de
2
@sprite: Eu teria adicionado um comentário, mas os comentários do StackOverflow são sempre mostrados como apenas um longo parágrafo. Para uma resposta de 5 parágrafos como a minha, isso teria resultado em um parágrafo longo, ilegível e hostil. Escrever uma resposta separada permitiu-me dar uma resposta mais clara, que tem mais probabilidade de ajudar outros usuários (o que, vamos encarar, é o ponto de sites como este)
Mike Gledhill
6

Encontrei o mesmo problema, por algum motivo, o Visual Studio não atualizou a configuração da web quando adicionei o serviço pela primeira vez. Descobri que atualizar a Referência de serviço também corrigiu esse problema.

Passos:

  1. Navegue até a pasta de referência de serviço
  2. Expanda-o
  3. Clique com o botão direito e selecione a atualização da referência de serviço
  4. Observe a configuração da web ser atualizada
Dale C
fonte
Sim, isso funcionou para mim. Estou usando uma referência de serviço wsdl de terceiros e estava recebendo este erro até que atualizei a referência de serviço
ejhost
Para mim também. Era óbvio, já que funciona bem e de repente não funciona. Posso ter feito uma alteração e não atualizei a referência de serviço.
ehh
4

Altere o web.config do serviço WCF como "endpoint address =" "binding =" basicHttpBinding "..." (anteriormente binding = "wsHttpBinding") Depois de construir o aplicativo, na configuração "ServiceReferences.ClientConfig" ""> tem o valor . Então vai funcionar bem.


fonte
3

Renomeie o output.config produzido por svcutil.exe para app.config. funcionou para mim.

ssilas
fonte
2

Você tem uma interface que implementa sua classe "UserService"?

Seus endpoints devem especificar uma interface para o atributo de contrato:

contract="UserService.IUserService"
Nick Josevski
fonte
1

Não tenho certeza se isso é um problema. Endpoint e binding têm o mesmo nome

David Valentine
fonte
1

Não tenho certeza se é realmente um problema, mas vejo que você tem o mesmo nome para sua configuração de vinculação ().

Normalmente tento chamar meus pontos de extremidade de algo como "UserServiceBasicHttp" ou algo semelhante (o "Binding" realmente não tem nada a ver aqui) e tento chamar minhas configurações de ligação de algo como ".... Configuration", por exemplo "UserServiceDefaultBinding", para evitar qualquer conflito de nomes em potencial.

Marc

marc_s
fonte
0

Tive que adicionar o serviço no arquivo App.config de chamada para que ele funcionasse. Certifique-se de que você, mas depois de tudo. Isso pareceu funcionar para mim.

Jackstine
fonte
0

Esse problema ocorre quando você usa o serviço por meio de outro aplicativo. Se o aplicativo tiver um arquivo de configuração, basta adicionar as informações de configuração do serviço a esse arquivo. Na minha situação não havia nenhum arquivo de configuração, então eu uso essa técnica e funcionou bem. Basta armazenar o endereço url no aplicativo, lê-lo e, usando o método BasicHttpBinding (), enviá-lo para o aplicativo de serviço como parâmetro. Esta é uma demonstração simples de como fiz isto:

Configuration config = new Configuration(dataRowSet[0]["ServiceUrl"].ToString());

var remoteAddress = new System.ServiceModel.EndpointAddress(config.Url);


SimpleService.PayPointSoapClient client = 
    new SimpleService.PayPointSoapClient(new System.ServiceModel.BasicHttpBinding(), 
    remoteAddress);
SimpleService.AccountcredResponse response = client.AccountCred(request);
Suleymani Tural
fonte
0

Para aqueles que trabalham com serviços AIF AX 2012 e tentam chamar o projeto C # ou VB dentro do AX (x ++) e sofrem com os erros de "não foi possível encontrar o endpoint padrão" ... ou "nenhum contrato encontrado" ... voltar ao seu projeto do Visual Studio (c #) e adicione essas linhas antes de definir seu cliente de serviço, em seguida, implante o projeto e reinicie o cliente AX e tente novamente: Observe, o exemplo é para o adaptador NetTcp , você pode facilmente usar qualquer outro adaptador de acordo com sua necessidade .

 Uri Address = new Uri("net.tcp://your-server:Port>/DynamicsAx/Services/your-port-name");
 NetTcpBinding Binding = new NetTcpBinding();
 EndpointAddress EndPointAddr = new EndpointAddress(Address);
 SalesOrderServiceClient Client = new SalesOrderServiceClient(Binding, EndPointAddr);
Boody
fonte
-2

No caso, se você estiver usando o aplicativo WPF usando a estrutura PRISM, a configuração deve existir em seu projeto de inicialização (ou seja, no projeto onde reside seu bootstrapper).

Resumindo, basta removê-lo da biblioteca de classes e colocá-lo em um projeto inicial.

VRK
fonte