2012-07-17 14 views
23

क्या Azure TableStorage RowKeys के भीतर प्रतिबंधित चरित्र पैटर्न हैं? मैं कई खोजों के माध्यम से किसी भी दस्तावेज को खोजने में सक्षम नहीं हूं। हालांकि, मुझे व्यवहार मिल रहा है जो कुछ प्रदर्शन परीक्षणों में इसका तात्पर्य है।Azure टेबल संग्रहण RowKey प्रतिबंधित वर्ण पैटर्न?

मुझे यादृच्छिक पात्रों पर रोके के साथ कुछ अजीब व्यवहार मिला है (परीक्षण चालक प्रतिबंधित वर्णों को रोकता है (/ \ #?) प्लस रोके में होने वाले सिंगल कोट्स को अवरुद्ध करता है)। नतीजा यह है कि मुझे एक रोकी मिली है जो तालिका में ठीक डालेगी, लेकिन पूछताछ नहीं की जा सकती है (परिणाम अमान्य इनपुट है)। उदाहरण के लिए:

RowKey: 9}5O0J=5Z,4,D,{!IKPE,~M]%54+9G0ZQ&G34!G+ 

इस RowKwy (समानता) द्वारा क्वेरी करने के लिए प्रयास कर रहा है एक त्रुटि में परिणाम होगा (दोनों हमारे अनुप्रयोग, Azure संग्रहण एक्सप्लोरर, और क्लाउड संग्रहण स्टूडियो 2 का उपयोग कर के भीतर)। मैं अनुरोध पर एक नज़र फ़िडलर के माध्यम से भेजा जा रहा है ले लिया:

GET /foo()?$filter=RowKey%20eq%20'9%7D5O0J=5Z,4,D,%7B!IKPE,~M%5D%54+9G0ZQ&G34!G+' HTTP/1.1 

यह RowKey में% 54 दिखाई देता है फिल्टर में से छोड़ा नहीं गया है। दिलचस्प बात यह है कि बैच एक्सएमएल में यूआरआई के साथ टेबल स्टोरेज में बैच अनुरोधों के लिए मुझे समान व्यवहार मिलता है जिसमें यह रोकी शामिल है। मैंने एम्बेडेड डबल कोट्स के साथ रोकेज़ के लिए भी इसी तरह के व्यवहार को देखा है, हालांकि मैंने अभी तक उस पैटर्न को अलग नहीं किया है।

क्या कोई मुझे इस व्यवहार में सह करता है? मैं पंक्तियों में होने वाले अतिरिक्त पात्रों को आसानी से प्रतिबंधित कर सकता हूं, लेकिन वास्तव में 'नियम' जानना चाहूंगा।

उत्तर

41

निम्न वर्णों PartitionKey और RowKey क्षेत्रों में अनुमति नहीं है:

  • फ़ॉरवर्ड स्लैश (/) चरित्र
  • बैकस्लैश (\) चरित्र
  • संख्या चिह्न (#) चरित्र
  • प्रश्न चिह्न (?) वर्ण

कृपया निम्नलिखित articl देखें अधिक जानकारी के लिए ई: http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx

+3

यह भी ध्यान देने योग्य है कि जब आप रोकी/विभाजन में% हो सकते हैं तो आपको किसी भी पंक्ति को पुनः प्राप्त करने की कोशिश करने में समस्या होगी जिसमें इसकी कुंजी में% है। एमएस समस्या से अवगत हैं और समाधानों की तलाश में हैं: http://blogs.msdn.com/b/windowsazurestorage/archive/2012/05/28/partitionkey-or-rowkey-containing-the-percent-character-causes-ome -विंडोज़-एज़ूर-टेबल-एपिस-टू-असफल.एएसपी – knightpfhor

+0

धन्यवाद नाइटफफर, यही वह है जिसे मैं ढूंढ रहा था। – MikeN

5

मैंने पाया कि Igorek के जवाब में सूचीबद्ध वर्णों के अलावा, ये भी समस्याएं पैदा कर सकता है (जैसे आवेषण विफल हो जाएंगे):

  • |
  • []
  • {}
  • <>
  • $^&

Azure Node.js SDK के साथ परीक्षण किया गया।

+2

इस उत्तर का कुछ उदाहरणों के साथ बैक अप लिया जाना चाहिए जो इस मुद्दे को दर्शाता है। मैं उपर्युक्त सूचीबद्ध वर्णों के साथ 'रोकी' के रूप में बैच अनुरोध करने में सफलतापूर्वक सक्षम हूं। 'विभाजनशन' का परीक्षण नहीं किया है, यह नहीं पता कि कोई अंतर है या नहीं। सीमा, यदि कोई है, शायद Node.js एसडीके में है (या केवल पुराने एज़ूर स्टोरेज एपीआई संस्करण पर लागू है)। एकमात्र चीज जिसे मैंने पाया था, दस्तावेज नहीं था यह है कि यूआरआई एन्कोडिंग का उपयोग न करने वाले एकल उद्धरण '' 'को यूआरएल से बचाना है, लेकिन लगातार दो सिंगल कोट' 'अक्षरों का उपयोग करना है। यानी ''' -> '' '' '। –

6

मुझे अभी पता चला है कि (हार्ड तरीका) कि '+' चिह्न की अनुमति है, लेकिन पार्टिशनकी में क्वेरी करना संभव नहीं है।

9

public static readonly Regex DisallowedCharsInTableKeys = new Regex(@"[\\\\#%+/?\u0000-\u001F\u007F-\u009F]");

अमान्य टेबल विभाजन की जांच और रो कुंजी: हो सकता है यह भी इस स्तर पर

string sanitizedKey = DisallowedCharsInTableKeys.Replace(tableKey, disallowedCharReplacement);

आप:

bool invalidKey = DisallowedCharsInTableKeys.IsMatch(tableKey);

अमान्य विभाजन साफ ​​करना या कुंजी पंक्ति sanitized कुंजी (विभाजन कुंजी या पंक्ति कुंजी) उपसर्ग करना चाहते हैं एक ही sanitized मूल्य वाले विभिन्न अमान्य कुंजी के झूठे टकराव से बचने के लिए मूल कुंजी के हैश के साथ।

स्ट्रिंग का उपयोग न करें। गेटहाशकोड() हालांकि यह एक ही स्ट्रिंग के लिए अलग हैश कोड उत्पन्न कर सकता है और विशिष्टता की पहचान करने के लिए इसका उपयोग नहीं किया जाएगा और इसे जारी नहीं रखा जाएगा।

मैं SHA256 का उपयोग करें: https://msdn.microsoft.com/en-us/library/s02tk69a(v=vs.110).aspx

, अवैध कुंजी की बाइट सरणी हैश बनाने हेक्स स्ट्रिंग के लिए बाइट सरणी बदलने और उस के साथ स्वच्छ तालिका कुंजी उपसर्ग के लिए।

भी देखें संबंधित MSDN प्रलेखन: https://msdn.microsoft.com/en-us/library/azure/dd179338.aspx

संबंधित धारा लिंक से: वर्ण कुंजी फ़ील्ड में अनुमति नहीं दी गई

निम्न वर्णों PartitionKey और RowKey गुण के लिए मान की अनुमति नहीं है:

आगे स्लैश (/) वर्ण

बीएसी kslash (\) चरित्र

संख्या चिह्न (#) चरित्र

प्रश्न चिह्न चरित्र यू से

नियंत्रण वर्ण + 0000 U + 001F करने के लिए, सहित (?):

  • क्षैतिज टैब (\ t) चरित्र

  • linefeed (\ n) चरित्र

  • गाड़ी वापसी (\ r) यू से चरित्र

नियंत्रण वर्ण + 007F U + 009F

ध्यान दें कि MSDN लेख में वर्णित वर्ण के अलावा, मैं यह भी कहा करने के लिए पैटर्न के लिए% char क्योंकि मैंने कुछ स्थानों पर देखा जहां लोग इसे समस्याग्रस्त होने का उल्लेख करते हैं। मुझे लगता है कि इनमें से कुछ भी उस भाषा और तकनीक पर निर्भर करता है जिसका उपयोग आप टेबल स्टोरेज तक पहुंचने के लिए कर रहे हैं।

यदि आप अपने मामले में अतिरिक्त समस्याग्रस्त वर्णों का पता लगाते हैं, तो आप उन्हें रेगेक्स पैटर्न में जोड़ सकते हैं, और कुछ भी बदलने की जरूरत नहीं है।

+0

हंस ओलाव द्वारा वर्णित आपके रेगेक्स में "+" चिह्न जोड़ने के लायक है। मुझे लगता है कि आपने उसी तर्क के साथ% साइन जोड़ा है - इसे कुंजी में अनुमति है, लेकिन क्वेरी के साथ-साथ '+' चिह्न भी मुश्किल है। मैं 100% निश्चित नहीं हूं लेकिन ऐसा लगता है कि सभी यूआरएल असंगत वर्णों को पूछताछ के लिए एन्कोड किया जाना चाहिए ... –

+0

धन्यवाद एलेक्सी और हंस। मैंने + regex पैटर्न में जोड़ा। –

1

उपर्युक्त के अतिरिक्त आप विभाजन कुंजी की शुरुआत में अंडरस्कोर _ का उपयोग नहीं कर सकते हैं, तो एक त्रुटि लौटा दी जाती है कि अंडरस्कोर से शुरू होने वाली कुंजी मान्य विभाजन कुंजी नहीं है।

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