2012-07-24 8 views
5

Es gibt ein WCF-Beispiel mit dem Namen LocalChannel, das von Microsoft bereitgestellt wird, um zu zeigen, wie eine benutzerdefinierte Bindung implementiert werden kann, um unnötigen Overhead beim Aufrufen eines Dienstes in derselben ApplicationDomain zu umgehen. Es ist die Probe Beschreibung angegeben wird, dass:Warum Serialisierung bei Verwendung von LocalChannel in WCF durchgeführt?

Diese Szenarien nützlich, in denen der Kunden und der Service in der gleichen Anwendungsdomäne und den Overhead des typischen WCF Kanalstapels (Serialisierung und Deserialisierung von Nachrichten) ausgeführt wird, muss Gemieden werden.

Ich habe diesen Code in meinem Projekt verwendet, aber trotz der Behauptung scheint es, dass Serialisierung stattfindet, wenn ein Dienst aufgerufen wird.

Um es klarer zu machen Ich habe den Code in den folgenden geändert, um einen Datenvertrag zu verwenden, so dass leicht festgestellt werden kann, ob die Serialisierung durchgeführt wird oder nicht.

# 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(); 
    } 
} 

Ausführen dieses Codes zeigt an, dass ‚Preis‘ Eigentum ‚ProductDTO‘ Klasse ist serialisiert und während der Gespräche über localbinding deserialisiert!

Hat jemand diese Methode schon einmal benutzt oder weiß, ob etwas nicht stimmt?

Antwort

6

Durch Rückrufe Zugabe kann ich bestätigen, dass in der Tat die Serialisierung/Deserialisierung definitiv passiert:

[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"); 
} 

Dies legt nahe, mir eine von mehreren Möglichkeiten:

  • sie beabsichtigen, die Urheber zu bewahren Semantik, die Sie normalerweise in WCF sehen würden, mit Client und Server verschiedene Kopien zu sehen
  • es funktioniert einfach nicht
  • die tun Dokumenta tion ist falsch

Da die Aussage here sagt:

Dies ist nützlich für Szenarien, in denen der Kunde und der Service in der gleichen Anwendungsdomäne und dem Overhead des typischen WCF-Kanal-Stack (Serialisierung und Deserialisierung von Nachrichten) muss vermieden werden.

Ich vermute eher die mittlere, das heißt, wer die Probe es funktioniert, ohne tatsächlich zu prüfen, ob die Serialisierung geschieht angenommen schrieb.

Jedoch! Es könnte auch sein, dass es vorgesehen war, einige Teile des Stapels (vor allem der IO-Stapel) auszuschneiden, aber wer auch immer die Dokumentationsseite falsch geschrieben hat, und falsch angegeben, dass Serialisierung auch weggelassen wurde.

+0

Ich schätze Ihre schnelle Antwort – Gholamreza

Verwandte Themen