2009-07-14 12 views
10

मैं एक जटिल प्रकार है:WCF, पोस्टिंग JSONized डेटा

[OperationContract] 
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/class/save")] 
bool Save(CustomClass custom); 
तो ब्राउज़र पक्ष मैं अपने CustomClass jsonized पर

:

[DataContract] 
public class CustomClass 
{ 
    [DataMember] 
    public string Foo { get; set; } 
    [DataMember] 
    public int Bar { get; set; } 
} 

मैं तो एक WCF RESTful वेब सेवा उस में यह है कि राशि यह करने के लिए वस्तु की तरह दिखता है:

var myClass = "{ foo: \"hello\", bar: 2 }"; 
$.ajax({ 
    contentType: "application/json", 
    data: { custom: myClass }, 
    dataType: "json", 
    success: callback, 
    type: "POST", 
    url: "MyService.svc/class/save" 
}); 

मैं $ .ajax का उपयोग कर तो मैं मैन्युअल रूप से सामग्री प्रकार के लिए सेट कर सकते हैं डब्ल्यू/jQuery डेटा सबमिट "applic व्यावहारिक/json "और जब यह प्रस्तुत postbody तरह

custom=<uri encoded version of myClass> 

मैं निम्नलिखित त्रुटि मिलती है दिखता है:

सर्वर अनुरोध संसाधित करते समय एक त्रुटि आई। अपवाद संदेश है 'वहां MyAssembly.CustomClass प्रकार के ऑब्जेक्ट के प्रारंभ तत्व को जांचने में त्रुटि हुई थी। अप्रत्याशित वर्ण 'सी'। अधिक जानकारी के लिए सर्वर लॉग देखें। अपवाद स्टैक ट्रेस है: System.Runtime.Serialization.XmlObjectSerializer.IsStartObjectHandleExceptions (XmlReaderDelegator पाठक) पर System.Runtime.Serialization.Json.DataContractJsonSerializer.IsStartObject (XmlDictionaryReader पाठक) System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter पर पर। ReadObject (संदेश संदेश) System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.DeserializeRequest पर (संदेश संदेश , वस्तु [] पैरामीटर) System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest पर (संदेश संदेश, वस्तु [] पैरामीटर) प्रणाली पर .ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequ स्था (संदेश संदेश , वस्तु [] पैरामीटर) System.ServiceModel.Dispatcher.CompositeDispatchFormatter.DeserializeRequest पर (संदेश संदेश, [] पैरामीटर वस्तु) System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs पर (MessageRpc & RPC) पर System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc & RPC) System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5 पर (MessageRpc & RPC) System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 पर (MessageRpc & RPC) सिस्टम पर। ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3 (MessageRpc & RPC) System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2 (MessageRpc & RPC) पर System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1 (MessageRpc & RPC) पर System.ServiceModel.Dispatcher.MessageRpc.Process पर (बूलियन isOperationContextSet)

मैंने अपने जेसन'एज्ड डेटा को लपेटने की कोशिश की है ... मैंने संदेश भेजने के लिए $ .post का उपयोग करने का प्रयास किया है (लेकिन यह सामग्री/जेसन पर सामग्री प्रकार सेट नहीं करता है इसलिए webservice समझ में नहीं आता है) .. कोई विचार?

उत्तर

3

तो समस्या यह है कि आप अनुभव कर रहे एक क्रमबद्धता त्रुटि है।WCF JSON में गुणों के साथ लिपटे ""

तो मैं सिर्फ एक ही त्रुटि जहां

data:'{id: 1 }', 

काम नहीं किया लेकिन

data:'{"id": 1 }', 

काम किया है में भाग का नाम देखना चाहता है

मुझे आशा है कि इस मदद करता है बाहर किसी और

3
समस्या यह है कि आप ओब भाग निकले गए

कोई सही ढंग से जेक्ट, लेकिन जब आप jQuery पोस्ट विधि में जटिल जेसन ऑब्जेक्ट का निर्माण कर रहे हैं तो आप रैपर से बच नहीं रहे हैं। तो आपको या तो इस तरह की पूरी जेएस ऑब्जेक्ट से बचने की आवश्यकता है: "{\" कस्टम \ ": \" {foo: \ "हैलो \", बार: 2} \ "}" (मैं वास्तव में यह कोशिश नहीं करता है, लेकिन काम करना चाहिए), या (शायद बेहतर समाधान) उपयोग JSON.stringify ({कस्टम: myClass})

WCF की ओर JSON वस्तुओं है कि यह धारावाहिक के लिए प्राप्त करता है वास्तव में संवेदनशील है।