अद्यतन 10/19/2010 मुझे पता है कि मैंने कुछ समय पहले इस प्रश्न से पूछा था, लेकिन इन उत्तरों में दिखाए गए कामकाज शायद ही संतोषजनक हैं, और यह अभी भी कई लोगों के लिए एक आम समस्या है। डब्ल्यूसीएफ बस लचीला नहीं है। मैंने डब्ल्यूसीएफ के बिना आरईएसटी सेवाओं को बनाने के लिए अपना खुद का खुला स्रोत सी # लाइब्रेरी शुरू की। कहा पुस्तकालय की जानकारी के लिए restcake.net या rest.codeplex.com देखें। अंत अद्यतनमैं जेसन.नेट का उपयोग करके, मेरी डब्लूसीएफ रेस्ट सर्विस (.NET 4) से जेसन को कैसे लौटा सकता हूं, बिना किसी स्ट्रिंग के उद्धरण में लपेटा जा सकता है?
अद्यतन 2012/08/02 ASP.NET Web API (पहले WCF वेब एपीआई, बाकी WCF के लिए प्रतिस्थापन) Json.NET डिफ़ॉल्ट रूप से उपयोग करता अंत अद्यतन
DataContractJsonSerializer
संभालने में असमर्थ है कई परिदृश्य जो Json.Net ठीक से कॉन्फ़िगर किए जाने पर ठीक है (विशेष रूप से, चक्र)।
एक सेवा विधि एक विशिष्ट ऑब्जेक्ट प्रकार लौट सकते हैं या तो (इस मामले में एक DTO में) है, जो मामले में DataContractJsonSerializer
उपयोग किया जाएगा, या मैं विधि हो सकता है एक स्ट्रिंग लौटने के लिए, और क्रमबद्धता करना अपने आप Json.Net साथ । समस्या यह है कि जब मैं किसी ऑब्जेक्ट के विपरीत एक जेसन स्ट्रिंग लौटाता हूं, क्लाइंट को भेजा गया जेसन उद्धरण में लपेटा जाता है।
का उपयोग DataContractJsonSerializer
, एक विशिष्ट ऑब्जेक्ट प्रकार लौटने प्रतिक्रिया है:
{"Message":"Hello World"}
एक json स्ट्रिंग वापस जाने के लिए Json.Net का उपयोग करना, प्रतिक्रिया है:
"{\"Message\":\"Hello World\"}"
मैं क्लाइंट पर परिणाम() या JSON.parse() को eval करना नहीं चाहते हैं, जो मुझे करना होगा यदि जेसन एक स्ट्रिंग के रूप में वापस आ जाता है, उद्धरण में लपेटा जाता है। मुझे एहसास है कि व्यवहार सही है; यह सिर्फ वही नहीं है जो मैं चाहता/चाहती हूं। मुझे कच्चे जेसन की जरूरत है; व्यवहार जब सेवा विधि का रिटर्न प्रकार एक ऑब्जेक्ट होता है, स्ट्रिंग नहीं।
तो, मैं अपनी विधि को ऑब्जेक्ट प्रकार कैसे लौटा सकता हूं, लेकिन नहीं DataContractJsonSerializer का उपयोग करें? इसके बजाय मैं Json.Net serializer का उपयोग करने के लिए कैसे कह सकता हूं?
या, प्रतिक्रिया स्ट्रीम पर सीधे लिखने के लिए कोई रास्ता है? तो मैं सिर्फ कच्चे जेसन को वापस कर सकता हूं? रैपिंग उद्धरण के बिना?
यहाँ संदर्भ के लिए मेरी काल्पनिक उदाहरण है,:
[DataContract]
public class SimpleMessage
{
[DataMember]
public string Message { get; set; }
}
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PersonService
{
// uses DataContractJsonSerializer
// returns {"Message":"Hello World"}
[WebGet(UriTemplate = "helloObject")]
public SimpleMessage SayHelloObject()
{
return new SimpleMessage("Hello World");
}
// uses Json.Net serialization, to return a json string
// returns "{\"Message\":\"Hello World\"}"
[WebGet(UriTemplate = "helloString")]
public string SayHelloString()
{
SimpleMessage message = new SimpleMessage() { Message = "Hello World" };
string json = JsonConvert.Serialize(message);
return json;
}
// I need a mix of the two. Return an object type, but use the Json.Net serializer.
}
मुझे यकीन नहीं है कि मैं समझता हूं कि आप किसी भी धारावाहिकरण का उपयोग क्यों कर रहे हैं। यदि आप WCF सेवा में जेएसओएन के रूप में वस्तुओं को वापस करना चाहते हैं, तो आप अनुबंध में 'WebMessageFormat.Json' के रूप में प्रतिक्रिया प्रारूप को बस सेट कर सकते हैं। – Cody
कोडी डेटा कंट्रैक्ट SUCKS.You महत्वपूर्ण मूल्य नहीं कर सकते हैं और तारीखें बिना किसी वापसी के खराब हो जाती हैं। इसके अलावा यह धीमा है लेकिन यह महत्वपूर्ण नहीं है – GorillaApe