2012-07-24 11 views
5

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?

Respuesta

6

Mediante la adición de devoluciones de llamada, puedo confirmar que, efectivamente, la serialización/deserialización es, sin duda pasando:

[OnSerializing] 
internal void OnSerializing(StreamingContext context) { 
    Console.WriteLine("OnSerializing"); 
} 
[OnSerialized] 
internal void OnSerialized(StreamingContext context) { 
    Console.WriteLine("OnSerialized"); 
} 
[OnDeserializing] 
internal void OnDeserializing(StreamingContext context) { 
    Console.WriteLine("OnDeserializing"); 
} 
[OnDeserialized] 
internal void OnDeserialized(StreamingContext context) { 
    Console.WriteLine("OnDeserialized"); 
} 

Esto me sugiere una de varias posibilidades:

  • tienen la intención de preservar la contra copias semántica que normalmente vería en WCF, con el cliente y el servidor mirando diferentes copias
  • simplemente no funciona
  • la do cumentation está mal

Teniendo en cuenta que la declaración here dice:

Esto es útil para situaciones donde el cliente y el servicio se ejecuta en el mismo dominio de aplicación y la sobrecarga de la pila típica canal de WCF (serialización y deserialización de mensajes) debe ser evitado.

en lugar Sospecho del medio, es decir, el que escribió la muestra supone que estaba trabajando, sin tener que comprobar si la serialización estaba sucediendo.

¡Sin embargo! También podría ser que estaba destinado a cortar algunas partes de la pila (principalmente, la pila IO), pero quien escribió la página de documentación malentendió, y declaró incorrectamente que la serialización también se omitió.

+0

Agradezco su rápida respuesta – Gholamreza

Cuestiones relacionadas