2013-02-27 189 views
5

मैं ऐसे पैटर्न का अनुसरण कर रहा हूं जिसमें डब्ल्यूसीएफ सेवा के अनुरोध और प्रतिक्रिया के लिए ऑब्जेक्ट्स हैं। मेरे पास गुणात्मक अनुरोध ऑब्जेक्ट्स हैं जिनके पास समान रिटर्न प्रकार और नाम है। किसी भी तरह की सहायता का स्वागत किया जाएगा।संदेशबॉडी मेम्बर एक ही रिटर्न प्रकार और नाम अपवाद के कारण - तत्व पहले ही निर्यात किया जा चुका है

मैं निम्नलिखित अपवाद हो रही है: System.InvalidOperationException:: एक अपवाद एक डबल्यूएसडीएल निर्यात विस्तार के लिए एक कॉल में फेंक दिया गया था

एक ExceptionDetail, संभावना IncludeExceptionDetailInFaults = सच है, जिसका मूल्य है के द्वारा बनाई गई: System.ServiceModel.Description.DataContractSerializerOperationBehavior अनुबंध: http://tempuri.org/:IService ----> सिस्टम। अविश्वसनीय अपवाद: सेवा .erviceContract.IService.RetrieveUsers ऑपरेशन एक संदेश तत्व का संदर्भ देता है [http://tempuri.org/:WeekEndingId] जिसे पहले ही निर्यात किया जा चुका है सेवा से .erviceContract.IService.RetrieveDepartments ऑपरेशन। आप विधि नाम बदलकर या ऑपरेशन कंट्रैक्ट एट्रिब्यूट की नाम संपत्ति का उपयोग करके संचालन में से किसी एक का नाम बदल सकते हैं। वैकल्पिक रूप से, आप MessageContract प्रोग्रामिंग मॉडल का उपयोग कर तत्व विवरण को अधिक विस्तार से नियंत्रित कर सकते हैं।

संपादित करें: मैंने गुणों पर नाम विशेषता का उपयोग अद्वितीय नाम देने के लिए किया है और इससे समस्या हल हो जाती है लेकिन हमें सभी अनुरोधों के लिए "WeekEndingId" नाम का उपयोग करने की आवश्यकता है। संपत्ति के लिए एक ही नाम का उपयोग करते हुए मैं इसके लिए एक फिक्स कोशिश करना और ढूंढना चाहता हूं।

RetrieveDepartmentsRequest:

[MessageContract(WrapperName = "RetrieveDepartmentsRequest", WrapperNamespace = "http://Service.V1")] 
    public class RetrieveDepartmentsRequest 
    { 
     [MessageBodyMember(Order = 0)] 
     public int WeekEndingId { get; set; } 

     [MessageBodyMember(Order = 1)] 
     public string UserId { get; set; } 

     [MessageBodyMember(Order = 2)] 
     public string MachineName { get; set; } 
    } 

RetrieveUsersRequest:

[MessageContract(WrapperName = "RetrieveUsersRequest", WrapperNamespace = "http://Service.V1")] 
public class RetrieveUsersRequest 
{ 
    [MessageBodyMember(Order = 0)] 
    public int WeekEndingId { get; set; } 

    [MessageBodyMember(Order = 1)] 
    public string UserId { get; set; } 

    [MessageBodyMember(Order = 2)] 
    public string MachineName { get; set; } 
} 

IService:

नीचे सूचीबद्ध कक्षाओं कि समस्या उत्पन्न कर रहा हैं

[OperationContract] 
[FaultContract(typeof(ServiceFault))] 
RetrieveDepartmentsResponse RetrieveDepartments(RetrieveDepartmentsRequest request); 

[OperationContract] 
[FaultContract(typeof(ServiceFault))] 
RetrieveUsersResponse RetrieveUsers(RetrieveUsersRequest request); 

उत्तर

2

मेरा मानना ​​है कि यह एक प्रकार संघर्ष है। उसमें: WeekEndingId पुनर्प्राप्ति DepartmentsRequest में एक int है और RetrieveUsersRequest में दशमलव है। संघर्ष का समाधान करने के लिए संदेश BodyMember की नाम संपत्ति का उपयोग करें। या बस पुनर्प्राप्ति यूज़र रिवेस्ट में संपत्ति का नाम बदलें।

या बेहतर अभी तक: सप्ताहांत नहीं होना चाहिए हमेशा एक int होना चाहिए?

+0

यह हमेशा एक int होना चाहिए, लेकिन बदलना यह समस्या को ठीक नहीं करता है। मैंने गुणों को अद्वितीय नाम देने के लिए नाम विशेषता का उपयोग किया है और यह समस्या को हल करता है लेकिन हम सभी अनुरोधों के लिए WeekEndingId संपत्ति नाम का उपयोग करना चाहते हैं। मैं यह देखने की कोशिश कर रहा हूं कि एक ही संपत्ति के नाम का उपयोग करते समय कोई फिक्स है या नहीं। सुझावों के लिए धन्यवाद। – Bryan

+1

मुझ पर शर्म आती है। मेरे पास कई घटनाएं थीं जहां मेरे पास एक अलग डेटा प्रकार के साथ एक ही संपत्ति का नाम था। ऐसा प्रतीत होता है कि आपके संदेश बॉडी सदस्यों में एक अलग डेटा प्रकार के साथ आपका नाम समान नहीं हो सकता है। बहुत बहुत धन्यवाद! – Bryan

0

मुझे विश्वास है कि आप जो समस्या देख रहे हैं वह है क्योंकि WrapperNamespace दोनों ऑब्जेक्ट्स के लिए समान है। मुझे लगता है कि आप क्या करना चाहते हैं:

[MessageContract(WrapperNamespace = "USEFUL_NAMESPACE_HERE.RetrieveDepartmentsRequest")] 

और

[MessageContract(WrapperNamespace = "USEFUL_NAMESPACE_HERE.RetrieveUsersRequest")] 

या आप की कोशिश कर सकते:

[MessageContract(IsWrapped = false)] 
+1

सुझाव के लिए धन्यवाद लेकिन मैंने दोनों की कोशिश की और न ही मेरे लिए काम किया। – Bryan

1

यह अपवाद संदेश संदेश में MessageHeader विशेषता का उपयोग करते समय भी हो सकता है।मैंने जो खोजा है वह यह है कि सभी संदेश हेडर जो किसी दिए गए सर्विसकंट्रैक्ट के भीतर सभी ऑपरेशन कॉन्ट्रैक्ट्स में उपयोग किए जाते हैं, में इस्तेमाल किए गए डेटा प्रकार के लिए एक अलग "नाम" होना चाहिए।

OperationContracts मूल रूप से आप के लिए नहीं कर सकते हैं: * शून्य MethodA (MessageContractA क) * शून्य MethodB (MessageContractB ख)

जहां MessageContractA वस्तु एक MessageHeader एक नाम "prop1" और MessageContractB वस्तु के साथ की घोषणा की है एक संदेश हैडर ने उसी "prop1" नाम के साथ घोषित किया है लेकिन एक अलग डेटा प्रकार है।

यह मलबे wsdl के साथ संयोजन में मेट मेटाडाटा निर्माण पर कहर बरकरार है।