No se pudo encontrar el elemento de punto final predeterminado

370

Agregué un proxy a un servicio web a una solución VS2008 / .NET 3.5. Al construir el cliente .NET arroja este error:

No se pudo encontrar el elemento de punto final predeterminado que hace referencia al contrato 'IMySOAPWebService' en la sección de configuración del cliente ServiceModel. Esto puede deberse a que no se encontró un 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 cliente.

La búsqueda de este error me dice que use el espacio de nombres completo en el contrato. Aquí está mi app.config con espacio de nombres completo:

<client>
  <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
            binding="basicHttpBinding" bindingConfiguration="IMySOAPWebServicebinding"
            contract="Fusion.DataExchange.Workflows.IMySOAPWebService" name="IMySOAPWebServicePort" />
</client>

Estoy ejecutando XP local (menciono esto porque varios éxitos de Google mencionan win2k3) La aplicación.config se copia en app.exe.config, por lo que tampoco es el problema.

¿Alguna pista?

edosoft
fuente
Si esto se ejecuta en un servidor web, entonces debe agregar .svc. Ejemplo: " 192.168.100.87:7001/soap/IMySOAPWebService.svc
Darren C
El servicio no es un servicio .NET, no se ejecuta en un servidor web.
edosoft
Resolví este problema en proyectos desarrollados en .NET, pero tengo algunos proyectos en VB6 y tengo el mismo problema. ¿Algunas ideas?
Gabriel Intriago

Respuestas:

588

"Este error puede surgir si está llamando al servicio en una biblioteca de clases y llamando a la biblioteca de clases desde otro proyecto".

En este caso, deberá incluir los ajustes de configuración de WS en los principales proyectos app.config si es una winapp o web.config si es una aplicación web. Este es el camino a seguir incluso con PRISM y WPF / Silverlight.

LR
fuente
1
Esta no fue la causa de mi problema específico, pero estoy seguro de que esto ayudará a otros. Gracias
edosoft
99
¿Hay alguna manera de fusionar automáticamente los dos? ¿Qué pasa si la biblioteca de clases actualiza su configuración? ¿Estás atascado recordando actualizar la información de configuración copiada en todos los proyectos que hacen referencia a ella? Esta solución parece depender demasiado de la vigilancia del desarrollador ...
Sean Hanley
1
Recibo el mismo error para una aplicación WP7 (Silverlight, creo) y me llevó demasiado tiempo notar que ServiceReferences.ClientConfigse genera en el directorio del proyecto. Copiar los elementos <bindings>y <client>del archivo de mi biblioteca a mi aplicación principal (que antes estaban vacías) hizo que todo funcionara.
David Mason el
44
La razón por la que esto sucede (según tengo entendido) es que los valores de configuración se leen desde el proyecto principal en una solución, ya sea web, winforms, wpf, etc. Digamos, por ejemplo, que tiene un proyecto de biblioteca de clases para acceder a una base de datos, la entrada connectionString tendrá que estar en la configuración principal del proyecto en lugar de la configuración de la biblioteca de clases.
Ciaran Bruen
66
Por lo tanto, podemos concluir que, si usamos WCF en una biblioteca, sería mejor codificar la configuración directamente como se muestra en el enlace stackoverflow.com/questions/7688798/… .
Youngjae
90

Resolví esto (creo que como otros podrían haber sugerido) creando las instancias de enlace y dirección de punto final yo mismo, porque no quería agregar nuevas configuraciones a los archivos de configuración (esto es un reemplazo para algún código de biblioteca existente que se usa ampliamente, y anteriormente usaba una referencia de servicio web anterior, etc.), por lo que quería poder agregar esto sin tener que agregar nuevas configuraciones de configuración en todas partes.

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

Si está usando https, entonces necesita usar en BasicHttpsBindinglugar de BasicHttpBinding.

Tom Haigh
fuente
1
Esta es una respuesta útil. En un servicio web que estoy usando, el punto final personalizado tenía que estar vinculado en la declaración inicial del objeto. No funcionaría si intentara hacerlo más tarde.
Paul Morel
2
Por mucho que sospeche que la respuesta principal también podría haber funcionado, su solución funcionó, y parece preferible que piratee mis propios archivos de configuración.
Soy Sam, dice Reinstate a Monica el
Funciona un encanto! Prefiero poder configurar el Endpoint en código en lugar de distribuir un archivo "app.config" con mi aplicación.
Daniel Gee
1
Si se trata de un servicio web Https, recuerde cambiar BasicHttpBinding () a BasicHttpsBinding ()
Anthony
Esta solución es mejor para aplicaciones como EXCEL-DNA que no tiene app.config o web.config.
user781700
75

Después de probar varias opciones, finalmente resolví esto usando

contract = "IMySOAPWebService"

es decir, sin el espacio de nombres completo en la configuración. Por alguna razón, el nombre completo no se resolvió correctamente

edosoft
fuente
3
Parece que el nombre del contrato debe escribirse exactamente de la misma manera que el cliente. En mi caso, lo hice var proxy = new ExternalServices.ServiceClient("MyServiceEndpoint");funcionar cuando agregué el espacio de nombres para contratar:contract="ExternalServices.IMyService"
Anatoly Mironov
Esto no funcionó para mí. Mi problema puede ser un poco diferente. Recibo este error de vez en cuando no siempre. ¿Cuál podría ser el problema? Podría error mighht haber al lado del servicio _Thanks?
albatros
57

He tenido este mismo problema. Resulta que para una REFERENCIA web, debe proporcionar la URL como primer parámetro al constructor:

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

Para un nuevo estilo de REFERENCIA DE SERVICIO web, debe proporcionar un nombre que haga referencia a una entrada de punto final en la configuración:

new WebService.WebServiceSoapClient("WebServiceEndpoint");

Con una entrada correspondiente en Web.configo App.config:

<client>
      <endpoint address="http://myservice.com/moo.aspx"
        binding="basicHttpBinding" 
        bindingConfiguration="WebService"
        contract="WebService.WebServiceSoap"
        name="WebServiceEndpoint" />
    </client>
  </system.serviceModel>

Bastante difícil de eliminar la visión del túnel en "funcionó en un programa anterior" ...

Andomar
fuente
3
Ah ja! Esto me lo solucionó, solo estaba usando un constructor vacío antes, que seguía fallando: new WebService.WebServiceSoapClient (); // fail
travis
¡Esta solución funcionó! pero tengo curiosidad por saber por qué no se cargó el punto final predeterminado. alguna idea de cuáles podrían ser las razones?
Dipti Mehta
@Andomar lamento mencionar un hilo viejo. ¿Tiene alguna ventaja sobre otra: WebReference y ServiceReference? Creo que lo primero sería más conveniente para mí, pero ServiceReference es algo nuevo y genial, supongo ...
Kev
17

Tuve una situación como esta, donde tuve

  • Servicio WCF alojado en algún lugar
  • Proyecto principal
  • Proyecto de consumidor de tipo 'biblioteca de clases' que tiene referencia de servicio a un servicio WCF
  • El proyecto principal llama métodos del proyecto del consumidor

Ahora el proyecto Consumer tenía todos los ajustes de configuración relacionados en <system.serviceModel>Tag de mi app.config, todavía arrojaba el mismo error que el anterior.

Todo lo que hice fue agregar la misma etiqueta <system.serviceModel>al archivo app.config de mi proyecto principal, y finalmente estuvimos listos.

El verdadero problema, en lo que respecta a mi caso, era leer el archivo de configuración incorrecto. En lugar de app.config del consumidor, se refería a la configuración principal del proyecto. Me tomó dos horas resolver eso.

Bravo
fuente
1
Mismo. Busque <system.serviceModel>en su biblioteca, luego cópielo en la aplicación principal.config de su aplicación. Solo otro síntoma de que la biblioteca de clases app.configs no se lee en tiempo de ejecución. Paso muchísimo tiempo compensando este descuido (OMI). Si quiero que la biblioteca lea su configuración desde su app.config, déjalo. De lo contrario, ¿por qué tener una app.config para bibliotecas de clases en primer lugar?
SteveCinq
15

"Este error puede surgir si está llamando al servicio en una biblioteca de clases y llamando a la biblioteca de clases desde otro proyecto".

"En este caso, deberá incluir los ajustes de configuración de WS en la aplicación principal de proyectos.config si es una winapp o web.config si es una aplicación web. Esta es la manera de hacerlo incluso con PRISM y WPF / Silverlight".

Sí, pero si no puede cambiar el proyecto principal (Orchard CMS, por ejemplo), puede mantener la configuración del servicio WCF en su proyecto.

Debe crear un asistente de servicio con el método de generación de clientes:

public static class ServiceClientHelper
{
    public static T GetClient<T>(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<ChannelEndpointElement>().First(e => e.Contract == contractAttribute.ConfigurationName);
        var channelFactory = new ConfigurationChannelFactory<T>(endpoint.Name, configuration, null);
        var client = channelFactory.CreateChannel();
        return client;
    }
}

y úsalo:

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

Ver detalles en este artículo .

melvas
fuente
15

Varias respuestas aquí dan con la solución correcta cuando te enfrentas al error de la referencia al servicio desde un archivo de clase: copia la información de configuración del servicio en tu app.config web.config de tu consola o aplicación de Windows. Sin embargo, ninguna de esas respuestas parece mostrarte qué copiar. Intentemos corregir eso.

Esto es lo que copié del archivo de configuración de mi biblioteca de clases, en el archivo de configuración de la aplicación de mi consola, para evitar este loco error para un servicio que escribo llamado "TranslationServiceOutbound".

Básicamente, quiere todo dentro de la sección system.serviceModel :

  <system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_ITranslationServiceOutbound" />
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://MyHostName/TranslationServiceOutbound/TranslationServiceOutbound.svc"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ITranslationServiceOutbound"
    contract="TranslationService.ITranslationServiceOutbound" name="BasicHttpBinding_ITranslationServiceOutbound" />
</client>

markaaronky
fuente
14

Este me volvió loco.

Estoy usando Silverlight 3 Prism (CAB) con WCF

Cuando llamo a un servicio WCF en un módulo Prism, obtengo el mismo error:

No se pudo encontrar el elemento de punto final predeterminado que hace referencia al contrato 'IMyService' en la sección de configuración del cliente del modelo de servicio. Esto puede deberse a que no se encontró un 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 cliente

Resulta que está buscando en el archivo .xap del Shell un archivo ServiceReferences.ClientConfig, no en el archivo ServiceReferences.ClientConfig del módulo. Agregué mi punto final y enlace al archivo existente ServiceReferences.ClientConfig en mi aplicación Silverlight Shell (llama a sus propios servicios WCF).

Luego tuve que reconstruir la aplicación Shell para generar el nuevo archivo .xap para la carpeta ClientBin de mi proyecto web.

Ahora esta línea de código finalmente funciona:

MyServiceClient myService = new MyServiceClient();
Jeff Moeller
fuente
11

Estaba recibiendo este error dentro de una aplicación ASP.NET donde el servicio WCF se había agregado a una biblioteca de clases que se agrega a la aplicación ASP.NET como un archivo .dll referenciado en la carpeta bin. Para resolver el error, la configuración de configuración en el archivo app.config dentro de la biblioteca de clases que hace referencia al servicio WCF necesitaba copiarse en la configuración web.config para el sitio / aplicación ASP.NET.

Zanderwel
fuente
Mientras que otras respuestas podrían haber descrito el mismo problema. Esta respuesta describió mi situación exacta y finalmente entendí el problema. Gracias por salvarme el día
Wouter Vanherck
10

Encontré (además de copiar en la configuración de la aplicación de la interfaz de usuario del cliente, ya que estaba usando una interfaz de la Biblioteca de clases) que tenía que prefijar el nombre del enlace con el nombre de la Referencia de servicio (el mío está ServiceReferenceen el siguiente).

p.ej:

<endpoint address="http://localhost:4000/ServiceName" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_ISchedulerService"
      contract="ServiceReference.ISchedulerService" 
      name="BasicHttpBinding_ISchedulerService" />

en lugar del predeterminado generado:

<endpoint address="http://localhost:4000/ServiceName" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_ISchedulerService"
      contract="ISchedulerService" 
      name="BasicHttpBinding_ISchedulerService" />
Matt Mitchell
fuente
1
Tenía que hacer lo mismo. Realmente no entiendo por qué.
Brig
8

Tuve el mismo problema, pero cambiar el espacio de nombres del contrato no funcionó para mí. Así que probé una referencia web de estilo .Net 2 en lugar de una referencia de servicio .Net 3.5. Eso funciono.

Para usar una referencia web en Visual Studio 2008, haga clic en 'Agregar referencia de servicio', luego haga clic en 'Avanzado' cuando aparezca el cuadro de diálogo. En eso encontrará una opción que le permitirá utilizar una referencia web en lugar de una referencia de servicio.

Cyril Gupta
fuente
2
Esto es lo que terminé haciendo también. Deseo que el problema tenga sentido para mí.
Jarrett Widman
Esto funcionó para mí también. Ahora tengo toda esta basura adicional en mi solución (Settings.Settings, una nueva carpeta Web References) sin ninguna buena razón. Tendré que volver y volver a visitar esto cuando tenga más tiempo.
Mike K
Convenido. Tuve el mismo problema y lo solucioné cambiándolo a una referencia web.
Stephen Hosking
7

La unidad que prueba una aplicación que no es de biblioteca y que consume un servicio puede causar este problema.

La información que otros han ingresado aborda la causa raíz de esto. Si está intentando escribir casos de prueba automatizados y la unidad que está probando realmente invocará la interfaz de servicio, debe agregar la referencia de servicio al proyecto de prueba. Esta es una muestra de la aplicación que utiliza el tipo de error de biblioteca. Sin embargo, no me di cuenta de inmediato porque mi código que consume la interfaz no está en una biblioteca . Sin embargo, cuando la prueba realmente se ejecute, se ejecutará desde el ensamblaje de prueba, no desde el ensamblaje bajo prueba.

Agregar una referencia de servicio al proyecto de prueba unitaria resolvió mi problema.

PatrickV
fuente
7

Tengo una situación que en la prueba de la Unidad. Copié el archivo app.config en el proyecto de prueba de la unidad. Por lo tanto, el proyecto de prueba unitaria también contiene información de punto final.


fuente
2
No copié la app.config completa, sino la system.serviceModelsección. ¡Eso es todo!
kwrl
Lo mismo, excepto que copié el system.serviceModelarchivo en la aplicación. Configuración de una aplicación de consola
AlbatrossCafe
5

Me enfrenté a este problema una vez. Fue porque todavía estaba desarrollando la interfaz que usa el servicio WCF. Configuré la aplicación de prueba y continué el desarrollo. Luego, en desarrollo, cambié algunos de los espacios de nombres de los servicios. Así que verifiqué dos veces "system.serviceModel -> client -> endpoint -> contract" en web.config para que coincida con la clase WCF. Entonces el problema está resuelto.

vardares
fuente
4

El espacio de nombres en su configuración debe reflejar el resto de la ruta del espacio de nombres después del espacio de nombres predeterminado de su cliente (como está configurado en las propiedades del proyecto). Según su respuesta publicada, supongo que su cliente está configurado para estar en el espacio de nombres "Fusion.DataExchange.Workflows". Si movió el código del cliente a otro espacio de nombres, necesitaría actualizar la configuración para que coincida con la ruta restante del espacio de nombres.

Chris Porter
fuente
3

Tengo el mismo problema. Utilicé el servicio WCF en la biblioteca de clases y llamo a la biblioteca de clases desde el proyecto de aplicación de Windows. <system.serviceModel>Pero olvido el cambio en el archivo de configuración de la aplicación de Windows <system.serviceModel>.
solución: cambiar la configuración del proyecto externo igual que la configuración wcf de la biblioteca de clases.

Dijo Mahoma Hashem
fuente
3

Hola, he encontrado el mismo problema, pero la mejor solución es dejar que .NET configure la configuración del lado del cliente. Lo que descubro es esto cuando agrego una referencia de servicio con una cadena de consulta de http: /namespace/service.svc? Wsdl = wsdl0 que NO crea puntos finales de configuración en el lado del cliente. Pero cuando elimino el? Wsdl-wsdl0 y solo uso la url http: /namespace/service.svc, crea la configuración del punto final en el archivo de configuración del cliente. para abreviar, elimine el "? WSDL = WSDL0".

Joey
fuente
3

No coloque la línea de declaración del cliente de servicio como campo de clase, en lugar de esto, cree una instancia en cada método que se haya utilizado. Así se solucionará el problema. Si crea una instancia de cliente de servicio como campo de clase, se produce un error de tiempo de diseño.

Mücahid Uslu
fuente
3

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

VRK
fuente
2

Este error puede surgir si está llamando al servicio en una biblioteca de clases y llamando a la biblioteca de clases desde otro proyecto.

Manuel Alves
fuente
2

Parece que hay varias formas de crear / solucionar este problema. Para mí, el producto CRM que estoy usando fue escrito en código nativo y puede llamar a mi .NET dll, pero me encuentro con la información de configuración que necesita estar en / por encima de la aplicación principal. Para mí, la aplicación CRM no es .NET, así que terminé teniendo que ponerla en mi archivo machine.config (no donde la quiero). Además, dado que mi compañía usa Websense, tuve dificultades incluso para agregar la Referencia de servicio debido a un problema de 407 Proxy Authentication Required, que requería una modificación en machine.cong.

Solución proxy:

Para que funcione la referencia de servicio WCF, tuve que copiar la información de la aplicación.config de mi DLL a la configuración principal de la aplicación (pero para mí eso fue machine.config). Y también tuve que copiar la información del punto final a ese mismo archivo. Una vez que lo hice, comenzó a funcionar para mí.

TPaul
fuente
2

Okay. Mi caso era un poco diferente, pero finalmente encontré la solución: tengo una Console.EXE -> DLL -> Invocando WS1 -> DLL -> Invocando WS2

He tenido las configuraciones del modelo de servicio de WS1 y WS2 en Console.EXE.config según lo recomendado. - No resolvió el problema.

Pero todavía no funcionó, hasta que también agregué la WebReference de WS2 a WS1 y no solo a la DLL que realmente crea e invoca el proxy de WS2.

Itay Levin
fuente
2

Si hace referencia al servicio web en su biblioteca de clases, debe copiar app.config a su aplicación de Windows o aplicación de consola

solución: cambiar la configuración del proyecto externo igual que la configuración wcf de la biblioteca de clases

Trabajó para mi

Roshan
fuente
2

Tuve el mismo problema
que estaba usando la aplicación de escritorio y el servicio web Global Weather

Eliminé la referencia de servicio y agregué la referencia web y el problema resuelto Gracias

Kamran Akhter
fuente
2

La solución para mí fue eliminar el nombre del punto final del atributo Nombre del punto final en el cliente web.config esto permitió que el proxy usara

ChannelFactory<TService> _channelFactory = new ChannelFactory<TService>("");

solo tomó todo el día para hacer ejercicio. Además, el nombre del contrato era incorrecto una vez que esta solución estaba en su lugar, aunque había sido incorrecto cuando apareció el error inicial. ¡Verificación doble y triple de las cadenas de nombre del contrato! Atrib: Ian

robar
fuente
2

Permítame agregar una cosa más para buscar. ( Tom Haigh's respuesta de ya lo alude, pero quiero ser explícito)

Mi web.configarchivo tenía lo siguiente definido:

<protocolMapping>
    <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>

Ya estaba usando basicHttpsBinding para una referencia, pero luego agregué una nueva referencia que requería basicHttpBinding (sin s). Todo lo que tenía que hacer era agregar eso a mi de la protocolMappingsiguiente manera:

<protocolMapping>
    <add binding="basicHttpBinding" scheme="http" />
    <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>

Como LR señala correctamente, esto debe definirse en los lugares correctos. Para mí, eso significaba uno en la aplicación app.config de mi proyecto de prueba de unidad, así como uno en web.config del proyecto de servicio principal.

David
fuente
2

Tuve este error cuando hacía referencia al Contrato en el elemento del archivo de configuración sin el operador de alcance global.

es decir

<endpoint contract="global::MyNamepsace.IMyContract" .../>

funciona, pero

<endpoint contract="MyNamepsace.IMyContract" .../>

muestra el error "No se pudo encontrar el elemento de punto final predeterminado que hace referencia al contrato".

El ensamblado que contiene MyNamepsace.IMyContract está en un ensamblado diferente a la aplicación principal, por lo que esto puede explicar la necesidad de utilizar la resolución de alcance global.

saille
fuente
2

Cuando agrega una referencia de servicio

ingrese la descripción de la imagen aquí

tenga cuidado con el espacio de nombres que está escribiendo:

ingrese la descripción de la imagen aquí

Debe agregarlo al nombre de su interfaz:

<client>
  <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
            binding="basicHttpBinding" 
            contract="MyNamespace.IMySOAPWebService" />
</client>
Waldemar Gałęzinowski
fuente
2

Obtuve el mismo error y he intentado muchas cosas pero no funcionó, entonces noté que mi "contrato" no era el mismo en todos los proyectos, cambié el contrato ya que sería el mismo para todos los proyectos dentro de la solución y funcionó. Este es el proyecto A

<client>
    <endpoint address="https://xxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="ServiceReference.IIntegrationService" name="basic" />
</client>

Proyecto B:

<client>
    <endpoint address="xxxxxxxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="ServiceReference1.IIntegrationService" name="basic" />
</client>

Finalmente cambié para ambos como:

<client>
    <endpoint address="https://xxxxxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="MyServiceReferrence.IIntegrationService" name="basic" />
</client>
nzrytmn
fuente
1

Tuve el mismo problema y se resolvió solo cuando la aplicación host y el dll que usaban ese punto final tenían el mismo nombre de referencia de servicio.

plata
fuente