example ejemplos wcf

wcf - ejemplos - ¿Por qué mi ChannelFactory no ve la configuración de mi endpoint?



wcf vs web api (5)

He estado siguiendo el excelente artículo de Miguel Castro sobre WCF here y todo está funcionando bien, excepto que tengo el siguiente código

public AdminClient() { ChannelFactory<IProductAdmin> factory = new ChannelFactory<IProductAdmin>(); productAdminChannel = factory.CreateChannel(); }

En mi archivo app.config, tengo la siguiente configuración:

<system.serviceModel> <client> <endpoint address="net.tcp://localhost:8002/ProductBrowser" binding="netTcpBinding" contract="Contracts.IProductAdmin" /> </client> </system.serviceModel>

Pero, cuando ejecuto el constructor para AdminClient, recibo una excepción que dice que el punto final no está definido. Sin embargo, si cambio mi configuración para darle un nombre al punto final y luego creo la fábrica de la siguiente manera, funciona.

public AdminClient() { var fac = new ChannelFactory<IProductAdmin>("admin"); productAdminChannel = fac.CreateChannel(); }

<system.serviceModel> <client> <endpoint name="admin" address="net.tcp://localhost:8002/ProductBrowser" binding="netTcpBinding" contract="Contracts.IProductAdmin" /> </client> </system.serviceModel>

Me encantaría una explicación para esto. La documentación en MSDN no es de mucha ayuda ...


Debe especificar el nombre del punto final, ya que puede tener muchos puntos finales para el mismo tipo de contrato. (Por ejemplo, un servicio que se implementa en un tcp y un punto final http ws). Microsoft podría haber construido algo en WCF para verificar si solo hay un cliente especificado para la interfaz del contrato, pero eso no hubiera sido muy consistente. (que funcionaría si solo hay un punto final especificado para el contrato). Cuando agregue otro punto final para el mismo contrato más adelante, el código se romperá en ese caso.


Esto me ha estado molestando por unos días, así que revisé los ejemplos que se muestran en el artículo que vinculó arriba. Todo funciona correctamente, excepto el segundo ejemplo de proxy de cliente con el que tiene un problema. Como ha señalado, y los otros que responden que crean un proxy de esa manera requieren un nombre de punto final, que se relaciona con el cliente (que es donde se define el punto final). Todavía no estoy seguro de por qué se comporta de la manera en que lo hace, pero no encontré la forma de usar ese ejemplo sin vincular explícitamente el proxy al punto final.

Por otro lado, el primer ejemplo que muestra cómo crear el proxy no requiere un acoplamiento explícito de la dirección o vinculación del punto final:

using System; using System.ServiceModel; namespace CoDeMagazine.ServiceArticle { public class ProductClient : ClientBase<IProductBrowser>, IProductBrowser { #region IProductBrowser Members public ProductData GetProduct( Guid productID) { return Channel.GetProduct(productID); } public ProductData[] GetAllProducts() { return Channel.GetAllProducts(); } public ProductData[] FindProducts( string productNameWildcard) { return Channel.FindProducts( productNameWildcard); } #endregion } }

Eso parece funcionar bien. Entonces, tal vez el segundo ejemplo de proxy es solo una forma pobre de hacer las cosas, o tal vez nos falta algo obvio ...


Puede escapar sin especificar el nombre del punto final en el lado del servicio. Para el lado del cliente, debe especificar el nombre, porque es posible que se conecte a servicios múltiples que tienen el mismo contrato. ¿Cómo sabría WCF cuál quieres?


Si no desea especificar la explicitud del nombre del punto final, puede escribir:

public AdminClient() { ChannelFactory<IProductAdmin> factory = new ChannelFactory<IProductAdmin>(string.Empty); productAdminChannel = factory.CreateChannel(); }

El constructor sin parámetros innecesario no funciona.


Use "*" para usar el primer punto final que califica.

public AdminClient() { ChannelFactory<IProductAdmin> factory = new ChannelFactory<IProductAdmin>("*"); productAdminChannel = factory.CreateChannel(); }

Ejemplo de MSDN