c# डब्ल्यूसीएफ बिना किसी "सेट" वाले गुणों पर चोक करता है। कोई कामकाज?




wcf properties (7)

यदि यह एक व्यवहार्य विकल्प है, तो ErrorBase रूप में ErrorBase होने के बजाय, इसे निम्नानुसार परिभाषित करें:

    public interface IError
    {
        string Message
        {
            [OperationContract]
            get;

            // leave unattributed
            set;
        }
    }

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

मेरे पास कुछ वर्ग है जो मैं एक सेवा विधि के परिणामस्वरूप गुजर रहा हूं, और उस वर्ग में केवल एकमात्र संपत्ति है:

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message { get { return ""; } }
}

मुझे सेवा पक्ष पर अपवाद मिल रहा है:

System.Runtime.Serialization.InvalidDataContractException: 'MyNamespace.ErrorBase' प्रकार में 'संदेश' के लिए कोई सेट विधि नहीं है।

मुझे यह संपत्ति केवल गेटटर के रूप में रखना है, मैं उपयोगकर्ताओं को इसे एक मान निर्दिष्ट करने की अनुमति नहीं दे सकता। कोई भी कामकाज मैं उपयोग कर सकता था? या क्या मुझे कुछ अतिरिक्त विशेषता याद आ रही है?


मुझे एएसपी.नेट एमवीसी के साथ यह समस्या थी और मैं JSON आउटपुट में आइटम्स पर नामों को नियंत्रित करने में सक्षम होने के लिए DataContractSerializer का उपयोग करना चाहता हूं। आखिरकार मैंने सीरियलाइज़र को JSON.NET पर स्विच किया, जो सेटर्स के बिना गुणों का समर्थन करता है (जो डेटाकंट्रैक्ट सर्राइज़र नहीं करता है) और संपत्ति नाम नियंत्रण (जो एएसपी.नेट एमवीसी में अंतर्निहित जेएसओएन सीरियलाइज़र नहीं है) [JsonProperty(PropertyName = "myName")]


यहां तक ​​कि यदि आपको मान को अपडेट करने की आवश्यकता नहीं है, तो ऑब्जेक्ट को deserialize करने के लिए सेटर का उपयोग WCFSerializer द्वारा किया जाता है (और मान को फिर से सेट करें)।

यह वही है जो आप बाद में हैं: डब्ल्यूसीएफ डाटाकंट्रैक्ट्स


क्या आपके पास अभी "डू-कुछ नहीं" सेटटर नहीं हो सकता है ??

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message 
  {
      get { return ""; } 
      set { }
  }
}

या उस पर DataContract serializer barf भी करता है ??


यदि आपके पास केवल गेटटर है, तो आपको संपत्ति को क्रमबद्ध करने की आवश्यकता क्यों है। ऐसा लगता है कि आप केवल पढ़ने योग्य संपत्ति के लिए डेटामेम्बर विशेषता को हटा सकते हैं, और सीरिएलाइज़र केवल संपत्ति को अनदेखा कर देगा।


[DataMember(Name = "PropertyName")]
public string PropertyName
{
    get
    {
        return "";
    }
    private set
    { }
}

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





datacontractserializer