2009-03-31 40 views
94

¿Alguna idea de cómo solucionarlo?WCF Error: no se pudo encontrar el elemento de punto final predeterminado que hace referencia al contrato 'UserService.UserService'

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> 

No se pudo encontrar el elemento extremo predeterminado que hace referencia a un contrato 'UserService.UserService' en la sección de configuración del cliente de ServiceModel. Esto podría deberse a que no se encontró ningún archivo de configuración para su aplicación, o porque no se pudo encontrar ningún elemento de punto final que coincida con este contrato en el elemento del cliente.

Resuelto!

No mencioné que esta era una aplicación de Silverlight. Tenía la referencia wcf en una DLL que tenía su propio archivo "ServiceReferences.ClientConfig". Moví el contenido de ServiceReferences.ClientConfig de la DLL al proyecto principal de Silverlight y funcionó.

+0

¿Qué sucede si la aplicación que ejecuta el archivo DLL es de terceros, p. el DLL es un complemento para otra aplicación? –

Respuesta

183

Tuve una carrera con el mismo problema. Mi aplicación también era una aplicación de Silverlight y se llamaba al servicio desde una biblioteca de clase con un UserControl personalizado que se estaba utilizando en él.

La solución es simple. Copie las definiciones de punto final del archivo de configuración (por ejemplo, ServiceReferences.ClientConfig) de la biblioteca de clases al archivo de configuración de la aplicación silverlight. Sé que esperarías que funcionara sin tener que hacer esto, pero aparentemente alguien en Redmond tuvo unas vacaciones ese día.

+49

Esta solución también es válida para proyectos ASP.NET y MVC. Si agrega el servicio a una Biblioteca de clases, no funcionará en la caja, tome la sección system.serviceModel de la aplicación.config en su proyecto de biblioteca y colóquela en su web.config. –

+5

Parece que esto es cierto para cualquier tipo de proyecto, estaba usando quartz.net como servicio de Windows y tenía un trabajo en un ensamblado diferente que hacía referencia al servicio web. Funcionó para mí también. Gracias. – thiagoleite

+2

Hola, también funcionó para un proyecto de Windows Phone. Como @thiagoleite dice que parece funcionar para la mayoría de los tipos de proyectos. – Thanushka

2

Tiene una interfaz que implementa su clase "UserService".

Sus puntos finales deben especificar una interfaz para el atributo contrato:

contract="UserService.IUserService" 
1

No estoy seguro si esto es un problema. Endpoint y binding tienen el mismo nombre

1

No estoy seguro de si realmente es un problema, pero veo que tiene el mismo nombre para su configuración de enlace().

Normalmente trato de llamar a mis puntos finales algo así como "UserServiceBasicHttp" o algo similar (el "Enlace" realmente no tiene nada que ver aquí), y trato de llamar a mis configuraciones vinculantes algo con ".... Configuración ", por ejemplo "UserServiceDefaultBinding", para evitar posibles conflictos de nombres.

Marc

4

Cambiar el web.config del servicio WCF como "dirección de punto final =" "unión = "basicHttpBinding" ..." (anteriormente unión = "wsHttpBinding") Después de construir la aplicación, en "ServiceReferences. ClientConfig "" "configuración> tiene el valor. Entonces funcionará bien.

12

Sólo en caso de que alguien golpea el mismo problema durante el uso de WPF (en lugar de WCF o Silverlight):

tuve este error, cuando se conecta a un servicio Web. Cuando mi código estaba en la solución de aplicación WPF "principal", no hubo problema, funcionó perfectamente. Pero cuando moví el código a la solución de capa DAL más sensible, lanzaría la excepción.

No se pudo encontrar el elemento de punto final predeterminado que hace referencia al contrato 'MyWebService.MyServiceSoap' en la sección de configuración del cliente de ServiceModel.Esto podría deberse a que no se encontró ningún archivo de configuración para su aplicación, o porque no se pudo encontrar ningún elemento de punto final que coincida con este contrato en el elemento del cliente.

Como ha indicado "Sprite" en este hilo, debe copiar manualmente la etiqueta.

Para aplicaciones WPF, esto significa que la copia de la etiqueta de la app.config en mi solución DAL a la app.config en la solución principal de la aplicación de WPF.

+0

esto es genial, pero sería mejor como un breve comentario bajo mi propia respuesta, al igual que lo hizo "Adam Pope". Sería leído por mucha más gente. – sprite

+2

@sprite: Hubiera agregado un comentario, pero los comentarios de StackOverflow siempre se muestran como un solo párrafo largo. Para una respuesta de 5 párrafos como la mía, eso hubiera resultado en un párrafo largo, ilegible y antipático. Escribir una respuesta separada me permitió dar una respuesta más clara, lo que es más probable que ayude a otros usuarios (que, reconozcámoslo, es el objetivo de sitios web como este) –

+0

Sí, esa es una buena razón, supongo. – sprite

3

Cambie el nombre de output.config producido por svcutil.exe a app.config. funcionó para mí.

+0

Se arregló mi problema. – NVM

-2

En caso si usted está utilizando la aplicación WPF usando marco PRISM continuación, la configuración debe existir en su puesta en marcha del proyecto (es decir, en el proyecto que reside el programa previo.)

En resumen simplemente sacarlo de la biblioteca de clases y poner en un proyecto de inicio.

40

También puede establecer estos valores programáticamente en la biblioteca de clases, esto evitará el movimiento innecesario de los archivos de configuración en la biblioteca. El código de ejemplo para BasciHttpBinding sencilla es -

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); 
+0

¡Funciona bien! ;) – wooncherk

+0

@wooncherk, mi biblioteca de clase tiene solo una referencia a un wsdl. ¿Dónde debería poner este código? Lo construyo en un dll de C# y pongo el dll en los archivos de mi aplicación, donde lo menciono desde IronPython. Gracias –

6

me encontré con el mismo problema, por cualquier razón Visual Studio no actualizó el web.config cuando por primera vez añadido el servicio. Descubrí que la actualización de la Referencia del servicio también solucionó este problema.

Pasos:

  1. vaya a la carpeta Servicio de Referencia
  2. expandirla
  3. Haga clic derecho y seleccione Actualizar referencia de servicio
  4. Observe web.config se actualiza
+0

Sí, esto funcionó para mí. Estoy usando una referencia de servicio wsdl de un tercero y recibía este error hasta que actualicé la referencia de servicio – ejhost

+0

para mí también. Era obvio ya que funciona bien y de repente no. Pude haber hecho un cambio y no actualicé la referencia del servicio. – ehh

0

este problema occures cuando usa su servicio a través de otra aplicación. Si la aplicación tiene un archivo de configuración, simplemente agregue su configuración de servicio inf ormación a este archivo. En mi situación no había ningún archivo de configuración, así que uso esta técnica y funcionó bien. Solo almacene la dirección URL en la aplicación, léala y usando el método BasicHttpBinding() envíela a la aplicación de servicio como parámetro. Esta es una demostración simple de cómo lo hizo:

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); 
0

Tuve que agregar el servicio en el archivo de llamada App.config para que funcione. Asegúrate de que lo tienes después de todo. Esto pareció funcionar para mí.

0

Para aquellos que trabajan con AX 2012 FIA servicios y tratar de llamar allí C# o proyecto VB dentro de AX (x ++) y sufren de este tipo de errores de "no pudo encontrar extremo predeterminado" ... o "sin contrato encontrado" ... vuelva a su proyecto visual studio (C#) y agregue estas líneas antes de definir su cliente de servicio, luego despliegue el proyecto y reinicie el cliente AX y vuelva a intentarlo: Tenga en cuenta que el ejemplo es El adaptador NetTcp, puede usar fácilmente cualquier otro adaptador según su necesidad.

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); 
Cuestiones relacionadas