2012-07-24 23 views
5

LocalChannel Microsoft द्वारा प्रदान नामित दिखाने के लिए बाध्यकारी एक कस्टम अनावश्यक भूमि के ऊपर बायपास करने के लिए जब एक ही ApplicationDomain में एक सेवा को फोन लागू किया जा सकता एक WCF नमूना है। यह नमूना वर्णन यह कहा गया कि:डब्ल्यूसीएफ में लोकलचनल का उपयोग करते समय सीरियलाइजेशन क्यों किया जाता है?

यह जहां ग्राहक और सेवा एक ही आवेदन डोमेन और ठेठ WCF चैनल ढेर के भूमि के ऊपर (क्रमबद्धता और संदेशों के अक्रमांकन) में चल रहे हैं चाहिए परिदृश्यों के लिए उपयोगी है दूर रहे।

मैंने अपने प्रोजेक्ट में इस कोड का उपयोग किया है, लेकिन दावा के बावजूद ऐसा लगता है कि एक सेवा कहने पर क्रमबद्धता होती है।

इसे और अधिक स्पष्ट मैं कोड बदल दिया है करने के लिए में तो यह आसानी से निर्धारित किया जा सकता है अगर क्रमबद्धता प्रक्रिया चल रही है या नहीं, एक डेटा अनुबंध का उपयोग करने के बाद।

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

इस कोड चल रहा है इंगित करता है कि की 'कीमत' संपत्ति 'ProductDTO' वर्ग है धारावाहिक और localbinding के माध्यम से कॉल के दौरान deserialized जा रहा है!

किसी को भी करने से पहले इस विधि का इस्तेमाल किया है या अगर कुछ गलत है गया है?

उत्तर

6

कॉलबैक को जोड़ कर, मैं पुष्टि कर सकता है कि वास्तव में क्रमबद्धता/अक्रमांकन निश्चित रूप से हो रहा है:

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

यह कई संभावनाओं में से एक मेरे लिए चलता है:

  • वे copy- को संरक्षित करने के लिए इच्छुक रहे हैं अर्थपूर्ण है कि आप आमतौर पर डब्ल्यूसीएफ में देखेंगे, क्लाइंट और सर्वर के साथ विभिन्न प्रतियां
  • यह बस
  • काम नहीं करता है cumentation गलत है

यह देखते हुए कि बयान here का कहना है:

इस परिदृश्य जहां ग्राहक और सेवा एक ही आवेदन डोमेन और ठेठ WCF चैनल ढेर के भूमि के ऊपर में चल रहे हैं (के लिए उपयोगी है संदेशों का क्रमिकरण और deserialization) से बचा जाना चाहिए।

मैं नहीं बल्कि बीच एक संदेह है, यानि कि जो कोई भी नमूना ग्रहण यह काम कर रहा था, वास्तव में देखना हो क्रमबद्धता हो रहा था बिना लिखा था।

हालांकि! यह भी हो सकता है कि यह कुछ भागों ढेर (मुख्य रूप से, आईओ ढेर) की को काटने का इरादा था, लेकिन जो कोई भी प्रलेखन पेज गलत समझा लिखा था, और गलत तरीके से कहा गया है कि क्रमबद्धता भी बाहर रखा गया था।

+0

मैं आपकी त्वरित प्रतिक्रिया की सराहना करता हूं – Gholamreza