2012-06-29 7 views
17

एएसपी.नेट वेबएपीआई बीटा से आरसी में अपग्रेड करने से कुछ उत्साह और निराशा का एक बड़ा सौदा प्रदान किया गया है। मैं अधिकांश मुद्दों के माध्यम से काम करने में सक्षम हूं, लेकिन जो मुझे अभी काट रहा है वह JSON अनुरोध डेटा की केस-संवेदनशीलता है।एएसपी.नेट वेबएपीआई जेएसओएन बाइंडिंग केस-सेंसिटीविटी

जेएसओएन अनुरोधों के लिए प्रयुक्त प्रारूपक (जो डिफ़ॉल्ट रूप से एक JSON.NET फॉर्मेटर है) केस संवेदनशील होता प्रतीत होता है जबकि फ़ॉर्म-यूरेनकोडेड डेटा के लिए प्रयुक्त फॉर्मेटर नहीं होता है। केस-असंवेदनशील फॉर्मेटर का उपयोग करने के लिए JSON अनुरोधों को कॉन्फ़िगर करने का कोई तरीका है?

यहाँ समस्या यह है कि मैं JSON अनुरोध के साथ हो रहा है वर्णन करने के लिए एक सरल उदाहरण है:

HTML/जावास्क्रिप्ट

<button id="tester">Click here!</button> 

<script type="text/javascript"> 
    $(function() { 
     $("#tester").on("click", function() { 
      $.ajax({ 
       type: "POST", 
       url: "/Api/Test/Index/" + 168, 
       data: ko.toJSON({ key: 123, value: "test value" }), // THIS FAILS 
           // Key: 123, Value: "test value" <- BUT THIS WORKS 
       contentType: "application/json; charset=utf-8", 
       statusCode: { 
        200: function() { 
         $("body").append("<p>Success</p>"); 
        }, 
        400: function() { 
         $("body").append("<p>Failure</p>"); 
        } 
       } 
      }).always(function() { 
       $("body").append("<hr />"); 
      }); 
     }); 
    }); 
</script> 

सी #

public class TestController : ApiController 
{ 
    public HttpResponseMessage Index(int? id, KeyValuePair<int, string> test) 
    { 
     if (id != 168 || test.Key != 123 || test.Value != "test value") 
      return Request.CreateResponse(HttpStatusCode.BadRequest); 

     return Request.CreateResponse(HttpStatusCode.OK); 
    } 
} 

मैंने उस लाइन पर एक टिप्पणी प्रदान की जहां JSON डेटा प्रदान किया गया है। मैं उचित रूप से आवरण संपत्ति सदस्यों द्वारा अपनी जावास्क्रिप्ट ऑब्जेक्ट्स के साथ सम्मेलन तोड़ना नहीं चाहूंगा और मैं निश्चित रूप से मेरे सी # गुणों को कम करने के द्वारा सम्मेलन तोड़ना नहीं चाहता हूं। कोई विचार?

+0

मैं थोड़ा यहाँ उलझन में हूँ। आप अपने डेटा को एक POST अनुरोध के भीतर भेजते हैं - दूसरे शब्दों में, अनुरोध निकाय के भीतर। लेकिन HTTP दस्तावेज़ीकरण में यह कहा गया है कि हेडर फ़ील्ड्स (और मान) को केस-असंवेदनशील माना जाता है, और शरीर के बारे में कुछ भी नहीं है ... आपको क्यों लगता है कि "यह फॉर्म-urlencoded डेटा के लिए व्यवहार नहीं है", मुझे आश्चर्य है? – raina77ow

+0

उदाहरण के लिए [इस चर्चा] [http://groups.google.com/group/soundcloudapi/browse_thread/thread/c266c0d2efa88fbb/9ad3969dde919cba) देखें। – raina77ow

+1

@ raina77ow यह वास्तव में HTTP विनिर्देश के बारे में एक प्रश्न नहीं है लेकिन एएसपी.NET वेबएपीआई आरसी द्वारा उपयोग किए गए JSON.NET फ़ॉर्मेटर का व्यवहार नहीं है। FormUrl फॉर्मेटर केस-असंवेदनशील प्रतीत होता है जबकि JSON.NET फ़ॉर्मेटर * केस-संवेदी है। –

उत्तर

6

महत्वपूर्ण गहराई में इस मुद्दे की खुदाई के बाद मुझे एहसास है कि मैं Json.NET KeyValuePair कनवर्टर में एक बग मार गया था आया था। जेम्स न्यूटन-राजा तरह पर्याप्त मेरी संबंधित सवाल का जवाब देने का था और ठीक करने के लिए एक लिंक प्रदान:

Json.NET Case-insensitive Property Deserialization

24

जेसन.NET फॉर्मेटर deserialization (जेसन -> सीएलआर) के लिए असंवेदनशील मामला है।

क्रमबद्ध करने पर, आप CamelCasePropertyNamesContractResolver का उपयोग करके ऊंट के आवरण प्राप्त कर सकते हैं।

अपने Global.asax में:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
+0

मुझे विश्वास था कि यह मामला है, लेकिन मैं उस व्यवहार को साबित करने में सक्षम नहीं हूं। कृपया मेरा संबंधित प्रश्न देखें: http://stackoverflow.com/questions/11266695/json-net-case-insensitive-property-deserialization –

+0

हम्म ... मैंने अभी कुछ जेसनकॉन्टर के साथ प्रयोग किया है। Deserializing KeyValuePair केस-संवेदी है, जैसा कि आप कहते हैं, लेकिन अगर मैं एक पॉको बना देता हूं, तो व्यवहार निश्चित रूप से असंवेदनशील होता है। लगता है कि KeyValuePair से गेटर्स हैं लेकिन कोई सेटर्स नहीं है, क्योंकि मैंने सेटवेल के साथ KeyValuePair के अपने संस्करण को परिभाषित किया है और यह काम करता है। –

+0

आह, आप कुछ पर हो सकते हैं ... मैं कुछ और प्रयोग करूँगा और देख सकता हूं कि मैं यह निर्धारित कर सकता हूं कि यह मिलान की गई कुंजी के साथ deserializing कैसे है। धन्यवाद! –