2011-02-23 11 views
14

Estoy tratando de consumir un servicio web WCF desde una aplicación de cliente .NET, y creo que necesito poder crear puntos finales mediante programación, pero no sé cómo. Creo que necesito hacer esto porque, cuando trato de ejecutar la aplicación, estoy consiguiendo el error siguiente:Crear configuraciones de punto final WCF en la aplicación cliente, ¿en el código?

Could not find default endpoint element that references contract 'IEmailService' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element.

Mientras solucionar este error, he creado un simple aplicación de Windows Forms, en el que trato de consumir el mismo servicio web Con esta aplicación de prueba, me puedo conectar al servicio web con éxito y obtengo una respuesta válida. Pero puedo reproducir el error exacto mencionado anteriormente en mi aplicación de prueba eliminando el nodo system.serviceModel y todos sus nodos secundarios del archivo app.config de la aplicación (es posible que no tenga que eliminar TODA esa sección, estoy no es seguro). Entonces, mi primer pensamiento fue que necesito agregar esa sección al archivo app.config para la aplicación real, y todo debería estar bien. Desafortunadamente, por razones ridículas que no entraré aquí, esa no es una opción. Por lo tanto, me queda la necesidad de generar esta información en código, dentro de la aplicación cliente.

Espero que alguien aquí me ayude a solucionar esto o me pueda recomendar un buen recurso para este tipo de problemas.

¿Es posible crear configuraciones de punto final en la aplicación del cliente, en el código?

Respuesta

37

De forma predeterminada, cuando realiza una operación Add Service Reference, el tiempo de ejecución WCF generará el proxy del lado del cliente para usted.

La forma más sencilla de usar que es una instancia del proxy de cliente con un constructor que no toma ningún parámetro, y sólo tienes que tomar la información de la app.config:

YourServiceClient proxy = new YourServiceClient(); 

Esto requiere que el archivo de configuración para tener una entrada <client> con su contrato de servicio; de lo contrario, obtendrá el error que tiene.

Pero la clase del lado del cliente proxy generado por el tiempo de ejecución de WCF también tiene constructores adicionales - uno toma una dirección de punto final y una unión, por ejemplo:

BasicHttpBinding binding = new BasicHttpBinding(SecurityMode.None); 
EndpointAddress epa = new EndpointAddress("http://localhost:8282/basic"); 

YourServiceClient proxy = new YourServiceClient(binding, epa); 

Con esta configuración, no se necesita ningún archivo de configuración en absoluto - Estás definiendo todo en código. Por supuesto, también puede establecer casi cualquier otra propiedad de su enlace y/o punto final aquí en el código.

+4

Esto es ** exactamente ** lo que necesitaba. ¡No puedo decirte lo mucho que aprecio esto! – campbelt

+0

¿Qué es "YourServiceClient proxy = new YourServiceClient();" ? es la interfaz? ¿Es el nombre del punto final, del cliente? En la aplicación.config XAML no me permite agregar el nombre a la etiqueta . –

9

Una forma oriental de consumir un servicio WCF si tiene una referencia al ensamblado que define la interfaz, está utilizando la clase System.ServiceModel.ChannelFactory.

Por ejemplo, si desea utilizar BasicHttpBinding:

var emailService = ChannelFactory<IEmailService>.CreateChannel(new BasicHttpBinding(), new EndpointAddress(new Uri("http://some-uri-here.com/)); 

Si usted no tiene una referencia al ensamblado de servicio, a continuación, puede utilizar uno de los constructores sobrecargados en la clase de proxy generada a especifique la configuración de enlace.

+0

Gracias, eulerfx. Soy nuevo en todo esto, así que no estoy seguro de cómo usar la variable una vez que contiene datos, pero exploraré este ángulo y veré a dónde me lleva. – campbelt

+0

¡Muchas gracias! Pude utilizar su sugerencia, junto con el recurso ubicado en la siguiente dirección para resolver esto: http://msdn.microsoft.com/en-us/library/ms734681.aspx – campbelt

+0

Arg ... resulta que , aunque esto permite que mi aplicación de prueba funcione correctamente sin que la sección system.serviceModel esté en el app.config, por alguna razón sigo recibiendo el mismo error de la aplicación real.Continuaré investigando. – campbelt

Cuestiones relacionadas