2009-02-04 5 views
24

डब्ल्यूसीएफ सेवा में, मेरे पास [डेटाकंट्रैक्ट] विशेषता के साथ दो वर्ग हैं। इन वर्गों में से एक के साथ दूसरे के साथ "एक-एक" संबंध है - इसलिए कक्षा बी कक्षा ए से प्राप्त हो सकती है। हालांकि, जब मैं इन दो वर्गों के बीच विरासत को कॉन्फ़िगर करता हूं, दोनों [डेटाकंट्रैक्ट] विशेषता के साथ दर्शाए जाते हैं, तो मेटाडेटा लोड करने में विफल रहता है सेवाओं का परीक्षण करते समय।डब्ल्यूसीएफ में, डेटा अनुबंध कक्षाएं एक-दूसरे से प्राप्त हो सकती हैं?

क्या यह डब्ल्यूसीएफ में संभव है? क्या मुझे एक और विशेषता याद आ रही है?

[DataContract] 
public class A 
{   
    [DataMember] 
    public MyCustomType AValue1{ get; set; } 

    [DataMember] 
    public MyCustomType AValue2 { get; set; } 
} 

[DataContract] 
public class B: A 
{  
    [DataMember] 
    public double BValue1{ get; set; } 

    [DataMember] 
    public double BValue2 { get; set; } 
} 

नोट: कस्टम प्रकारों को डेटा अनुबंधों का उपयोग करके भी परिभाषित किया जाता है।

अद्यतन:

Error: Cannot obtain Metadata from http://localhost:8002/GISDataServices/mex If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address. For help enabling metadata publishing, please refer to the MSDN documentation at http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange Error URI: http://localhost:8002/GISDataServices/mex Metadata contains a reference that cannot be resolved: ' http://localhost:8002/GISDataServices/mex '. Receivera:InternalServiceFault The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace logs.HTTP GET Error URI: http://localhost:8002/GISDataServices/mex There was an error downloading ' http://localhost:8002/GISDataServices/mex '. The request failed with HTTP status 400: Bad Request.

अद्यतन 2: नीचे मेरा उत्तर देखें नीचे त्रुटि है।

उत्तर

38

हां, लेकिन आपको बेस क्लास को [ज्ञात टाइप एट्रिब्यूट] के साथ व्युत्पन्न वर्ग के प्रकार के साथ सजाने की आवश्यकता है। उदाहरण के लिए:

[DataContract] 
[KnownType(typeof(B))] 
public class A 
{ 
    [DataMember] 
    public string Value { get; set; } 
} 

[DataContract] 
public class B : A 
{ 
    [DataMember] 
    public string OtherValue { get; set; } 
} 
+0

यह काम नहीं प्रतीत होता है। मेटाडेटा लोड करते समय भी मुझे एक त्रुटि मिलती है। –

+0

आप क्या त्रुटि देख रहे हैं? –

+0

महान सवाल। क्या आप अपनी सटीक त्रुटि पोस्ट कर सकते हैं? –

1

इस परीक्षण के आधार पर इसे ठीक काम करना चाहिए। क्या दोनों वर्गों में डिफॉल्ट कन्स्ट्रक्टर हैं? क्या आप ऑटो-प्रॉपर्टी का उपयोग कर रहे हैं। नोट, इस मूल नमूने में गुणों की आवश्यकता नहीं है। इसके अलावा, जैसा कि डेविड मॉर्टन ने आपको बताया है कि आप किस तत्व पर लौट रहे हैं, इस पर निर्भर करते हुए आपको KnownType विशेषता की आवश्यकता हो सकती है, मैं 100% नहीं हूं लेकिन ज्ञात प्रकार को ऑपरेशन अनुबंध पर जाना पड़ सकता है।

class Program 
{ 
    static void Main(string[] args) 
    { 
     var serializer = new DataContractSerializer(typeof(Employee)); 

     var employee = new Employee() { Name="Joe", Salary=100000 }; 
     using (var ms = new MemoryStream()) 
     { 
      serializer.WriteObject(ms, employee); 

      ms.Position = 0; 

      var newEmployee = serializer.ReadObject(ms) as Employee; 
     } 

     Console.ReadKey(); 

    } 
} 

[DataContract] 
public class Employee : Person 
{ 
    [DataMember] 
    public decimal Salary { get; set; } 
} 

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public string Name { get; set; } 
} 

[ServiceContract] 
interface IEmployeeService 
{ 
    [OperationContract] 
    Person GetPerson(); 

    [OperationContract] 
    Employee GetEmployee(); 

    [OperationContract] 
    [KnownType(typeof(Employee))] 
    Person GetEmployeeAsPerson(); 
} 
+0

मैं ऑटो-प्रॉपर्टी का उपयोग कर रहा हूं लेकिन जब मैं विरासत निर्माण को हटाता हूं तो ठीक काम करता है। –

+0

न तो कक्षा एक स्पष्ट निर्माता का उपयोग करती है। –

+0

क्या आप समस्या पोस्ट विरासत निर्माण के साथ अपनी पोस्ट अपडेट कर सकते हैं? – bendewey

7

ठीक है, मैंने सवाल उठाया। जवाब है ... मैं मूर्ख हूँ। विरासत के साथ इसका कोई लेना-देना नहीं था। बेस क्लास में, मेरे पास 'सेट' प्रॉपर्टी क्लॉज के बिना डेटा अनुबंध सदस्य था - केवल 'get'। रवींद्र !!! एक 'सेट' खंड में डालकर यह एक आकर्षण की तरह काम करता है।

भ्रम के लिए खेद है।

संबंधित मुद्दे