example - wcf endpoint configuration
No se pudo encontrar el elemento de punto final predeterminado (30)
"Este error puede surgir si llama al servicio en una biblioteca de clases y llama 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 un winapp o web.config si es una aplicación web. Este es el camino a seguir incluso con PRISM y WPF / Silverlight".
Sí, pero si no puede cambiar el proyecto principal (por ejemplo, Orchard CMS), puede mantener la configuración del servicio WCF en su proyecto.
Necesita crear un ayudante 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 .
He agregado un proxy a un servicio web a una solución VS2008 / .NET 3.5. Al construir el cliente .NET lanza 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 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 cliente.
La búsqueda de este error me indica 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 (lo menciono porque algunos resultados de Google mencionan win2k3). El archivo app.config se copia a app.exe.config, por lo que tampoco es el problema.
¿Alguna pista?
"Este error puede surgir si llama al servicio en una biblioteca de clases y llama 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 un winapp o web.config si es una aplicación web. Este es el camino a seguir incluso con PRISM y WPF / Silverlight.
Cuando está agregando una referencia de servicio
tenga cuidado con el espacio de nombres que está escribiendo:
Debe adjuntarlo al nombre de su interfaz:
<client>
<endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
binding="basicHttpBinding"
contract="MyNamespace.IMySOAPWebService" />
</client>
De acuerdo. Mi caso fue un poco diferente, pero finalmente encontré la solución: tengo un Console.EXE -> DLL -> Invocación de WS1 -> DLL -> Invocación de WS2
He tenido las configuraciones del modelo de servicio de WS1 y WS2 en el archivo Console.EXE.config como se recomienda. - No solucioné el problema.
Pero aún no funcionó, hasta que agregué la referencia web de WS2 a WS1 también y no solo a la DLL que creaba e invocaba el proxy de WS2.
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 (según lo 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 moviera el código del cliente a otro espacio de nombres, tendría que actualizar la configuración para que coincida con la ruta de espacio de nombres restante.
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).
Encontré (además de copiar en la interfaz de usuario App.config ya que estaba usando una interfaz de biblioteca de clases) tuve que prefijar el nombre del enlace con el nombre de la referencia de servicio (el mío es ServiceReference
en la siguiente página).
p.ej:
<endpoint address="http://localhost:4000/ServiceName" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISchedulerService"
contract="ServiceReference.ISchedulerService"
name="BasicHttpBinding_ISchedulerService" />
En lugar del valor predeterminado generado:
<endpoint address="http://localhost:4000/ServiceName" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISchedulerService"
contract="ISchedulerService"
name="BasicHttpBinding_ISchedulerService" />
Este error puede surgir si llama al servicio en una biblioteca de clases y llama a la biblioteca de clases desde otro proyecto.
Este me volvía loco.
Estoy usando Silverlight 3 Prism (CAB) con WCF
Cuando llamo a un servicio de WCF en un módulo Prism, recibo 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 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 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 el enlace al archivo ServiceReferences.ClientConfig existente 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();
Habiendo probado varias opciones, finalmente resolví esto usando
contrato = "IMySOAPWebService"
Es decir, sin el espacio de nombres completo en la configuración. Por alguna razón, el nombre completo no se resolvió correctamente
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 web de REFERENCIA DE SERVICIO, 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.config
o 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 más antiguo" ...
Hola, encontré 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 NO crea un punto final de configuración en el lado del cliente. Pero cuando elimino el? Wsdl-wsdl0 y solo uso el url http: /namespace/service.svc, se crea la configuración del punto final en el archivo de configuración del cliente. para el remoe corto el "? WSDL = WSDL0".
La prueba unitaria de una aplicación que no sea de biblioteca 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. Este es un sabor de la aplicación que utiliza el tipo de error de biblioteca. Sin embargo, no me di cuenta inmediatamente de esto porque mi código que consume la interfaz no está en una biblioteca . Sin embargo, cuando la prueba se ejecute, se ejecutará desde el ensamblaje de prueba, no desde el ensamblaje bajo prueba.
Agregar una referencia de servicio al proyecto de prueba de unidad resolvió mi problema.
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>("");
Sólo 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 estado equivocado cuando apareció el error inicial. Doble y luego cheque triple para el nombre del contrato cuerdas personas !! atribución: Ian
Me enfrenté a este problema una vez. Fue porque todavía estaba desarrollando la interfaz que usa el servicio WCF. Configuré aplicación de prueba y desarrollo continuo. Luego, en el 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 se resuelve.
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 utilice. Por lo tanto, el problema se solucionará. Si crea una instancia de cliente de servicio como campo de clase, ¡se produce un error de tiempo de diseño!
Parece que hay varias formas de crear / solucionar este problema. Para mí, el producto de CRM que estoy utilizando estaba escrito en código nativo y puede llamar a mi dll .NET, pero me encuentro con la información de configuración que debe estar en / encima de la aplicación principal. Para mí, la aplicación de CRM no es .NET, así que tuve que ponerla en mi archivo machine.config (no donde la quiero). Además, dado que mi empresa utiliza Websense, me costó mucho incluso agregar la Referencia de servicio debido a un problema de autenticación del proxy 407, que requería una modificación en la máquina.cong.
Solución de proxy:
Para que la referencia de servicio de WCF funcionara, 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 era machine.config). Y también tuve que copiar la información del punto final en ese mismo archivo. Una vez lo hice empezando a trabajar para mí.
Permíteme agregar una cosa más para buscar. ( La respuesta de Tom Haigh ya lo alude, pero quiero ser explícito)
Mi archivo web.config
tenía definido lo siguiente:
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
Ya estaba usando basicHttpsBinding para una referencia, pero luego agregué una nueva referencia que requería basicHttpBinding (no s). Todo lo que tenía que hacer era agregar eso a mi protocolMapping
, de la siguiente manera:
<protocolMapping>
<add binding="basicHttpBinding" scheme="http" />
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
Como L.R. señala correctamente, esto debe definirse en los lugares correctos. Para mí, eso significaba uno en la aplicación.config de mi proyecto de prueba de unidad, así como uno en web.config del proyecto de servicio principal.
Recibí el mismo error e intenté varias cosas, pero no funcioné, de lo que noté que mi "contrato" no era el mismo para proyectos completos, cambié el contrato como 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é por los dos como:
<client>
<endpoint address="https://xxxxxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="MyServiceReferrence.IIntegrationService" name="basic" />
</client>
Recibía 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, las configuraciones de configuración en el archivo app.config dentro de la biblioteca de clases que hacen referencia al servicio WCF necesitaban ser copiadas en las configuraciones web.config para el sitio / aplicación ASP.NET.
Resolví esto (creo que otros pueden haber sugerido) al crear yo mismo las instancias de enlace y dirección de punto final, porque no quería agregar nuevas configuraciones a los archivos de configuración (esto reemplaza a algunos códigos de bibliotecas existentes que se usan ampliamente) y anteriormente usé una referencia de servicio web anterior, etc.), así que quería poder dejar 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 BasicHttpsBinding
lugar de BasicHttpBinding
.
Si hace referencia al servicio web en su biblioteca de clases, debe copiar app.config en su aplicación de Windows o consola.
solución: cambiar la configuración del proyecto externo igual que la configuración de wcf de la biblioteca de clases.
Trabajó para mi
Solo para cualquier otra persona con el mismo problema; Escribí una prueba de unidad para mi método que intentaba conectarse a mi servicio. Falló con esta misma excepción cada vez, no tengo idea de por qué. Cuando lo ejecuté desde un winform funciona bien.
Tengo el mismo problema. Utilizo el servicio WCF en la biblioteca de clases y llamo a la biblioteca de clases desde la aplicación de Windows project.but I''m Forget Change <system.serviceModel>
En el archivo de configuración de la aplicación de windows Project mismo the <system.serviceModel>
del archivo app.Config de Class Library.
solución: cambiar la configuración del proyecto externo igual que la configuración de wcf de la biblioteca de clases.
Tengo una situación que en la prueba de la unidad. Copié el archivo app.config al proyecto de prueba de la unidad. Así que el proyecto de prueba de unidad también contiene información de punto final.
Tuve el mismo problema
Estaba usando una aplicación de escritorio y usando el servicio web Global Weather
Borré la referencia de servicio y agregué la referencia web y el problema resuelto Gracias
Tuve el mismo problema, pero cambiar el espacio de nombres del contrato no me funcionó. 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.
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" .../>
trabaja, pero
<endpoint contract="MyNamepsace.IMyContract" .../>
da el error "No se pudo encontrar el elemento de punto final predeterminado que hace referencia al contrato".
El ensamblaje que contiene MyNamepsace.IMyContract se encuentra en un ensamblaje diferente al de la aplicación principal, por lo que esto puede explicar la necesidad de usar la resolución de alcance global.
Tuve una situación como esta, donde tuve
- Servicio WCF alojado en algún lugar
- Proyecto principal
- Proyecto del consumidor de tipo ''biblioteca de clases'' que tiene una referencia de servicio a un servicio WCF
- Principales métodos de convocatorias de proyectos del proyecto del consumidor
Ahora, el proyecto del Consumidor tenía todos los ajustes de configuración relacionados en la etiqueta <system.serviceModel>
de mi app.config, todavía estaba lanzando 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 nos pusimos en marcha.
El problema real, en mi caso, era leer el archivo de configuración incorrecto. En lugar de app.config del consumidor, se refería a la configuración del proyecto principal. Me tomó dos horas darme cuenta de eso.
Varias respuestas aquí se topan con la solución correcta cuando se enfrenta a un error confuso al referirse al servicio desde un archivo de clase: copie la información de configuración del servicio en su app.config web.config de su consola o aplicación de Windows. Sin embargo, ninguna de esas respuestas parece mostrarte qué copiar. Vamos a tratar de 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 error loco para un servicio que escribo llamado "TranslationServiceOutbound".
Básicamente quieres 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>