Hay una muestra de WCF llamada LocalChannel proporcionada por Microsoft para mostrar cómo se puede implementar un enlace personalizado para eludir los gastos indirectos innecesarios al llamar a un servicio en el mismo dominio de aplicación. Es la descripción de muestra se afirma que:¿Por qué se realizó la serialización cuando se usa LocalChannel en WCF?
Esto es útil para escenarios en los que el cliente y el servicio se ejecutan en el mismo dominio de aplicación y la sobrecarga de la pila de canal típico WCF (serialización y deserialización de mensajes) deben ser evitado
He utilizado este código en mi proyecto, pero a pesar de la afirmación, parece que la serialización tiene lugar cuando se está llamando a un servicio.
Para hacerlo más claro he cambiado el código a lo siguiente para usar un contrato de datos, por lo que se puede determinar fácilmente si se está realizando una serialización o no.
# region Service Contract
[ServiceContract]
public interface IGetPrice
{
[OperationContract]
ProductDTO GetPriceForProduct(int productCode);
}
[DataContract]
public class ProductDTO
{
private string _price;
public ProductDTO(string price)
{
_price = price;
}
#region Overrides of Object
public override string ToString()
{
return string.Format("Price = '{0}'", _price);
}
#endregion
[DataMember]
public string Price
{
get { return _price; }
set { _price = value; }
}
}
public class GetPrice : IGetPrice
{
#region IGetPrice Members
public ProductDTO GetPriceForProduct(int productId)
{
return new ProductDTO((String.Format("The price of product Id {0} is ${1}.",
productId, new Random().Next(50, 100))));
}
#endregion
}
# endregion
internal class Program
{
private static void Main(string[] args)
{
var baseAddress = "net.local://localhost:8080/GetPriceService";
// Start the service host
var host = new ServiceHost(typeof (GetPrice), new Uri(baseAddress));
host.AddServiceEndpoint(typeof (IGetPrice), new LocalBinding(), "");
host.Open();
Console.WriteLine("In-process service is now running...\n");
// Start the client
var channelFactory
= new ChannelFactory<IGetPrice>(new LocalBinding(), baseAddress);
var proxy = channelFactory.CreateChannel();
// Calling in-process service
var priceForProduct = proxy.GetPriceForProduct(101);
Console.WriteLine("Calling in-process service to get the price of product Id {0}: \n\t {1}"
, 101, priceForProduct);
Console.WriteLine("Calling in-process service to get the price of product Id {0}: \n\t {1}"
, 202, proxy.GetPriceForProduct(202));
Console.WriteLine("Calling in-process service to get the price of product Id {0}: \n\t {1}"
, 303, proxy.GetPriceForProduct(303));
Console.WriteLine("\nPress <ENTER> to terminate...");
Console.ReadLine();
}
}
La ejecución de este código indica que la propiedad de 'Precio' clase 'ProductDTO' se publica por entregas y deserializado durante las llamadas a través de localbinding!
¿Alguien ha usado este método antes o sabe si algo anda mal?
Agradezco su rápida respuesta – Gholamreza