Error de WCF: no se pudo encontrar el elemento de extremo predeterminado que hace referencia al contrato 'UserService.UserService'

98

Alguna idea de cómo solucionar este problema?

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 de punto final predeterminado que hace referencia al contrato 'UserService.UserService' en la sección de configuración del cliente ServiceModel. Esto puede deberse a que no se encontró ningún archivo de configuración para su aplicación o a que no se pudo encontrar ningún elemento de punto final que coincida con este contrato en el elemento de cliente.

¡Resuelto!

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

NotDan
fuente
¿Qué pasa si la aplicación que ejecuta la DLL es de terceros, por ejemplo, la DLL es un complemento para otra aplicación?
Stefanos Kargas

Respuestas:

186

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

La solucion es simple. Copie las definiciones de punto final del archivo de configuración (por ejemplo, ServiceReferences.ClientConfig) de la biblioteca de clases en el 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 vacaciones ese día.

duende
fuente
50
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á correctamente, tome la sección system.serviceModel de app.config en su proyecto de biblioteca y colóquela en su web.config.
Adam Pope
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. También funcionó para mí. Gracias.
Thiagoleite
2
Hola, también funcionó para un proyecto de Windows Phone. Como dice @thiagoleite, parece que está funcionando para la mayoría de los tipos de proyectos.
Thanushka
3
+1 para la broma de vacaciones de Redmond ... De todos modos, ¿hay alguna manera de agregarlo como un archivo externo en lugar de jugar con el web.config?
Shimmy Weitzhandler
1
@sprite Terminé configurando mi configuración requerida en el código (he anulado el constructor del cliente), como respuesta de Vishal . De esta manera, se envía a través de ensamblajes. ¡Gracias!
Shimmy Weitzhandler
45

También puede establecer estos valores mediante programación en la biblioteca de clases, esto evitará el movimiento innecesario de los archivos de configuración a través de la biblioteca. El código de ejemplo para BasciHttpBinding simple 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);
Vishal
fuente
@wooncherk, mi biblioteca de clases tiene solo una referencia a un wsdl. ¿Dónde debo poner este código? Lo construyo en una dll de C # y pongo la dll en los archivos de mi aplicación, donde hago referencia a ella desde IronPython. Gracias
Срба
12

En caso de que alguien tenga el mismo problema mientras usa WPF (en lugar de WCF o Silverlight):

Tuve este error al conectarme a un servicio web. Cuando mi código estaba en la solución "principal" de la aplicación WPF, no había problema, funcionaba perfectamente. Pero cuando moví el código a la solución de capa DAL más sensible, arrojarí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 ServiceModel. Esto puede deberse a que no se encontró ningún archivo de configuración para su aplicación o a que no se pudo encontrar ningún elemento de punto final que coincida con este contrato en el elemento de cliente.

Como ha dicho "Sprite" en este hilo, es necesario copiar manualmente la etiqueta.

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

Mike Gledhill
fuente
esto es genial, pero sería mejor como un comentario corto 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 habría resultado en un párrafo largo, ilegible y hostil. Escribir una respuesta separada me permitió dar una respuesta más clara, que es más probable que ayude a otros usuarios (que, seamos sinceros, es el objetivo de sitios web como este)
Mike Gledhill
6

Me encontré con el mismo problema, por alguna razón, Visual Studio no actualizó la configuración web cuando agregué el servicio por primera vez. Descubrí que la actualización de la Referencia de servicio también solucionó este problema.

Pasos:

  1. Navegue a la carpeta de referencia del servicio
  2. Expandelo
  3. Haga clic derecho y seleccione Actualizar referencia de servicio
  4. Observe que la configuración web se actualiza
Dale C
fuente
Sí, esto funcionó para mí. Estoy usando una referencia de servicio wsdl de terceros y recibía este error hasta que actualicé la referencia del servicio
ejhost
Para mí también. Era obvio ya que funciona bien y de repente no. Es posible que haya realizado un cambio y no actualicé la referencia de servicio.
ehh
4

Cambie el web.config del servicio WCF como "endpoint address =" "binding =" basicHttpBinding "..." (anteriormente binding = "wsHttpBinding") Después de compilar la aplicación, en "ServiceReferences.ClientConfig" "" configuración> tiene el valor . Entonces funcionará bien.


fuente
3

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

ssilas
fuente
2

¿Tiene una interfaz que implementa su clase "UserService"?

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

contract="UserService.IUserService"
Nick Josevski
fuente
1

No estoy seguro si esto es un problema. El punto final y el enlace tienen el mismo nombre

david valentine
fuente
1

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

Por lo general, trato de llamar a mis puntos finales algo como "UserServiceBasicHttp" o algo similar (el "Binding" realmente no tiene nada que ver aquí), y trato de llamar a mis configuraciones de enlace algo con ".... Configuration", por ejemplo "UserServiceDefaultBinding", para evitar posibles conflictos de nombres.

Bagazo

marc_s
fuente
0

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

Jackstine
fuente
0

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

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
fuente
0

Para aquellos que trabajan con los servicios AIF de AX 2012 e intentan llamar al proyecto C # o VB dentro de AX (x ++) y sufren tales errores de "no se pudo encontrar el punto final predeterminado" ... o "no se encontró contrato" ... volver a su proyecto de visual studio (c #) y agregue estas líneas antes de definir su cliente de servicio, luego implemente el proyecto y reinicie el cliente AX y vuelva a intentarlo: Tenga en cuenta que el ejemplo es para el adaptador NetTcp , podría usar fácilmente cualquier otro adaptador según sus necesidades .

 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
fuente
-2

En caso de que esté utilizando la aplicación WPF utilizando el marco PRISM, la configuración debería existir en su proyecto de inicio (es decir, en el proyecto donde reside su programa de arranque).

En resumen, simplemente elimínelo de la biblioteca de clases y colóquelo en un proyecto de inicio.

VRK
fuente