2008-08-24 37 views
6

Tengo un servicio web WCF al que se hace referencia desde una biblioteca de clases. Después de que se ejecute el proyecto, al crear el objeto cliente de servicios desde el interior de una biblioteca de clases, recibo un InvalidOperationException con el mensaje:InvalidOperationException durante la creación de la instancia del servicio web wcf

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

El código que estoy utilizando para crear la instancia es:

myServiceClient = new MyServiceClient(); 

donde MyServiceClient hereda de

System.ServiceModel.ClientBase

¿Cómo puedo solucionar esto?

Nota: Tengo una aplicación de consola separada que simplemente crea el mismo objeto de servicio y hace llamadas a él y funciona sin problemas.

Respuesta

5

Aquí está mi archivo app.config de la biblioteca de clases:

Usted debe poner esta configuración de configuración en el archivo de configuración de la aplicación principal. La aplicación .NET (que está llamando a su biblioteca de clase) usa datos de su propio archivo de configuración, no de su archivo de configuración de biblioteca.

+3

¿Dónde está su app.config? – iamserious

0

Probablemente sería útil publicar el archivo app.config, ya que este tipo de error tiende a señalar un problema en el bloque <endpoint>. Asegúrese de que el atributo del contrato le parezca correcto.

Editar: Pruebe completamente el valor de su contrato; usa el espacio de nombre completo Creo que eso es necesario.

1

Tuve un caso similar. Tenía una biblioteca de clases que llamaba a un servicio web, luego tenía un .EXE que llamaba al .DLL de la clase-lib. Creo que es el archivo de configuración .EXE que se usa y no el de la configuración .DLL.

Pero como dijo Richard anteriormente, tuve que calificar completamente el espacio de nombres. Es un poco doloroso A continuación, es exactamente lo que he cambiado. El problema es que tuve que cambiarlo en dos lugares, uno en la referencia.cs que se genera al crear una referencia de servicio, y el otro en el archivo de configuración. Por lo tanto, cada vez que cambio el servicio web y hago una "Actualización de referencia", tengo que hacer el cambio al código C# nuevamente.

1) en realidad se debe cambiar el ConfigurationName en los reference.cs de la siguiente manera:

Desde: [System.ServiceModel.ServiceContractAttribute(Namespace = "http://TFBIC.RCT.BizTalk.Orchestrations", ConfigurationName = " RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations")]

Para: [System.ServiceModel.ServiceContractAttribute(Namespace = "http://TFBIC.RCT.BizTalk.Orchestrations", ConfigurationName = "TFBIC.RCT.HIP.Components.RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations")]

2) y luego también cambiar el valor “contrato” en todos los relacionados con app.config (para .dll y.exe) de la siguiente manera:

Desde:

< dirección de punto final = http://nxwtest08bt1.dev.txfb-ins.com/TFBIC.RCT.BizTalk.Orchestrations/WcfService_TFBIC_RCT_BizTalk_Orchestrations.svc vinculantes = "wsHttpBinding" bindingConfiguration = contrato = "RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations" "" WSHttpBinding_ITwoWayAsync name = "WSHttpBinding_ITwoWayAsync" >

Para:

< dirección del punto final = http://nxwtest08bt1.dev.txfb-ins.com/TFBIC.RCT.BizTalk.Orchestrations/WcfService_TFBIC_RCT_BizTalk_Orchestrations.svc de unión = "wsHttpBinding" bindingConfiguration = nombre de "WSHttpBinding_ITwoWayAsync" contrato = "TFBIC.RCT.HIP.Components.RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations" = "WSHttpBinding_ITwoWayAsync" >

Para que quede claro - ¿Cómo sabía lo que llena el espacio de nombres ¿estaba? El espacio de nombre del programa era TFBIC.RCT.HIP. Dentro de eso, el código C# tiene una instrucción adicional espacio de nombres:

namespace RCTHipComponents 
8

o puede establecer el punto final en el código:

http://msdn.microsoft.com/en-us/library/ms731862.aspx

BasicHttpBinding binding = new BasicHttpBinding(); 
EndpointAddress address = new EndpointAddress("http://url-to-service/"); 

// Create a client that is configured with this address and binding. 
MyServiceClient client = new MyServiceClient(binding, address); 
Cuestiones relacionadas