एज़्योर टेबल स्टोरेज 400 बैड रिक्वेस्ट देता है


119

मैंने इसे डिबग मोड में चलाया, और मैं अपवाद के विवरण के साथ एक छवि संलग्न करता हूं। मैं कैसे जान सकता हूं कि क्या गलत हुआ? मैं एक टेबल में डेटा इनसेट करने की कोशिश कर रहा था। Azure मुझे अधिक जानकारी नहीं दे सकता है?

अवलोकन: भंडारण Windows Azure पर है मेरी मशीन पर नहीं। टेबल बनाए गए थे, लेकिन डेटा डालने पर मुझे यह त्रुटि मिलती है

यहां छवि विवरण दर्ज करें

// Retrieve the storage account from the connection string.
Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=***;AccountKey=***");

// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

// Create the table if it doesn't exist.
CloudTable table = tableClient.GetTableReference("EmployeeOnlineHistory");
table.CreateIfNotExists();

और यहाँ सम्मिलित कोड है:

public static void SetStatus(Employee e, bool value)
{
    try
    {
        // Retrieve the storage account from the connection string.
        Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=###;AccountKey=###");

        // Create the table client.
        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

        // Create the CloudTable object that represents the "people" table.
        CloudTable table = tableClient.GetTableReference("EmployeeOnlineHistory");

        // Create a new customer entity.

        if (value == true)
        {
            EmployeeOnlineHistory empHistory = new EmployeeOnlineHistory(e.Id);
            empHistory.IsOnline = true;
            empHistory.OnlineTimestamp = DateTime.Now;
            TableOperation insertOperation = TableOperation.Insert(empHistory);
            table.Execute(insertOperation);
        }
        else
        {
            TableQuery<EmployeeOnlineHistory> query = new TableQuery<EmployeeOnlineHistory>()
                .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, e.Id.ToString()));
            EmployeeOnlineHistory entity = table.ExecuteQuery(query).Take(1).FirstOrDefault();

            if ((entity!=null)&&(entity.IsOnline))
            {
                entity.IsOnline = false;
                entity.OfflineTimestamp = DateTime.Now;
                entity.OnlineTime = (entity.OfflineTimestamp - entity.OnlineTimestamp);
                TableOperation updateOperation = TableOperation.Replace(entity);
                table.Execute(updateOperation);
            }
            else
            {
                EmployeeOnlineHistory empHistory = new EmployeeOnlineHistory(e.Id);
                empHistory.IsOnline = false;
                empHistory.OfflineTimestamp = DateTime.Now;
                TableOperation insertOperation = TableOperation.Insert(empHistory);
                table.Execute(insertOperation);
            }
        }
    }
    catch (Exception ex)
    {
        //var details = new System.IO.StreamReader(((Microsoft.WindowsAzure.Storage.StorageException)ex)..Response.GetResponseStream()).ReadToEnd();
        LogFile.Error("EmployeeOnlineHistory.setStatus",ex);
    }
}

वह तस्वीर वास्तव में मदद नहीं करती है, त्रुटि 400 की पुष्टि करने से अलग। क्या "आपके द्वारा निष्पादित कोड को दिखाने में मदद करेगा" जिसके परिणामस्वरूप खराब अनुरोध हुआ: आपने स्टोरेज क्लाइंट कैसे सेट किया, आपने टेबल कैसे सेट किया, फिर चला गया सम्मिलित करने के लिए, आदि
डेविड माकॉन

मैंने कोड को कॉपी-पेस्ट किया। आशा है कि यह मदद करता है
रयान

यह मदद करेगा यदि आपने कहा कि कई मामलों में से कौन सा मामला विफल हो रहा है। इसके अलावा, आप स्पष्ट रूप से इस कोड के बाहर कुछ गुण स्थापित कर रहे हैं (जैसे, PartitionKey और RowKey) ताकि यह जानने में मदद मिल सके कि वे क्या हैं और वे किसके लिए सेट किए जा रहे हैं।
ब्रायन रिस्किल

मैंने देखा कि जब अपवाद को पहले फेंक दिया जाता है, तो कोई "दृश्य विस्तार" विकल्प नहीं होता है, लेकिन जब आप डीबग करना जारी रखते हैं और प्रवाह कॉलर पर वापस चला जाता है (जहां अपवाद फिर से पॉप अप होता है), तो आप दृश्य विवरण विकल्प देख सकते हैं। वहाँ से आप त्रुटि का पता लगाने के लिए
@ जूहा पालोमाकी के

जवाबों:


148

400 त्रुटि का मतलब है कि आपकी किसी संपत्ति के मूल्य में कुछ गड़बड़ है। यह पता लगाने का एक तरीका है कि फ़िडलर के माध्यम से अनुरोध / प्रतिक्रिया का पता लगाना और Windows Azure Storage पर भेजे जा रहे वास्तविक डेटा को देखना।

एक जंगली अनुमान लगाते हुए, मैं आपके कोड पर एक त्वरित नज़र डालकर यह मान रहा हूं कि आपके मॉडल में आपके पास कुछ दिनांक / समय प्रकार के गुण (ऑफलाइनटेस्टैम्प, OnlineTimestamp) हैं और देखा है कि कुछ परिदृश्यों में उनमें से एक को डिफ़ॉल्ट रूप से प्रारंभ किया गया है जो " DateTime.MinValue " है। कृपया ध्यान दें कि Windows Azure [http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx] में दिनांक / समय प्रकार विशेषता के लिए अनुमत न्यूनतम मान 1 जनवरी, 1601 (UTC) है । कृपया देखें कि क्या ऐसा नहीं है। यदि ऐसा है, तो आप उन्हें अशक्त प्रकार के फ़ील्ड बना सकते हैं ताकि वे डिफ़ॉल्ट मानों से आबाद न हों।

नीचे दिए गए Juha Palomäki के उत्तर पर एक नज़र डालें ... कभी-कभी अपवाद में थोड़ा अधिक उपयोगी संदेश होता है जहां वह सुझाव देता है (RequestInformation.ExtendedErrorInformation.ErrorMessage)


259
भगवान के प्यार के लिए, अगर एज़्योर टीम के किसी व्यक्ति ने इसे पढ़ा है, तो कृपया एसडीके को 400 बैड रिक्वेस्ट त्रुटि की तुलना में अधिक जानकारी वापस करें। मुझे नहीं पता कि टेबल स्टोरेज में DateTime के पास .NET DateTime ऑब्जेक्ट के समान न्यूनतम तारीख क्यों नहीं हो सकती है, लेकिन मैंने इस पर एक अच्छा दिन बर्बाद किया है। जब तक मैं नीचे गया कि किस संपत्ति के कारण समस्या हुई, तो मैं इस पार भी हुआ, जिससे मदद मिली। अब, इससे पहले कि मैं टेबल स्टोरेज के लिए डेटटाइम के साथ किसी मॉडल को सम्मिलित / अपडेट करूं, मुझे सभी डेटटाइम गुणों पर चेक चलाना होगा। आदर्श नहीं ...
माइकल

8
जब हम इस पर होते हैं, तो आपके पास एक एनम संपत्ति भी नहीं हो सकती है। मुझे
Martin

15
जाहिर है, टेबल के नाम में हाइफ़न भी नहीं हो सकते। मुझे यह पता लगाने के लिए एक घंटा लगा।
अमोघ नाटु

4
तालिका के नाम अंडरस्कोर नहीं हो सकते हैं .. इसीलिए मैं यहाँ हूँ
Quango

2
मुझे लगता है कि RowKey को खाली स्ट्रिंग के साथ आरंभ नहीं किया जाता है क्योंकि यह मुख्य देखने का मूल्य है और केवल अनुक्रमित स्तंभ है ... यह आपको यह याद दिलाने के लिए याद दिलाने के लिए है कि मैंने सोचा होगा .... यह केवल मेरा अनुमान है ... जहाँ तक सारणी के नाम .. इस बारे में पढ़ें ... blogs.msdn.microsoft.com/jmstall/2014/06/12/…
dreadeddev

129

StorageException में त्रुटि के बारे में थोड़ी अधिक विस्तृत जानकारी भी है।

डीबगर में जांचें: StorageException.RequestInformation.ExtendedInformation

यहां छवि विवरण दर्ज करें


6
यह जानकारी शीर्ष स्तर का अपवाद क्यों नहीं है?
विल्को वैन डेर वेन

मेरे लिए इस पर प्रकाश डाला गया .. "एमुलेटर द्वारा समर्थित नहीं बूँदें" .. एफएमएल
मिचेल कॉर्निले

The specifed resource name contains invalid characters.मेरी तालिका के नाम में डैश था ... मेरी कतार के नामों की तरह ... आह। उम्मीद है कि यह खोज अधिक लोगों के लिए चुनती है! देखें: stackoverflow.com/questions/45305556/...
Nateous

55

मेरे मामले में यह रोवे में एक आगे का स्लैश था ।

मुझे एक 'OutOfRangeInput - अनुरोध में से एक इनपुट सीमा से बाहर है।' भंडारण एमुलेटर के माध्यम से मैन्युअल रूप से जोड़ने की कोशिश करते समय त्रुटि।

मुख्य फ़ील्ड्स में वर्ण अस्वीकृत

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

  • आगे स्लैश ( / ) वर्ण
  • बैकस्लैश ( \ ) वर्ण
  • संख्या चिह्न ( # ) वर्ण
  • प्रश्न चिह्न ( ? ) वर्ण
  • नियंत्रण वर्ण U + 0000 से U + 001F सहित,:
    • क्षैतिज टैब ( \ t ) वर्ण
    • लाइनफ़ीड ( \ n ) वर्ण
    • गाड़ी वापसी ( \ r ) वर्ण
    • U + 007F से U + 009F पर नियंत्रण वर्ण

http://msdn.microsoft.com/en-us/library/dd179338.aspx

मैंने इसे संभालने के लिए एक विस्तार विधि लिखी।

public static string ToAzureKeyString(this string str)
{
    var sb = new StringBuilder();
    foreach (var c in str
        .Where(c => c != '/'
                    && c != '\\'
                    && c != '#'
                    && c != '/'
                    && c != '?'
                    && !char.IsControl(c)))
        sb.Append(c);
    return sb.ToString();
}

4
यह मेरा मुद्दा भी था। आपका एक्सटेंशन तरीका एक विजेता की तरह काम करता है!
जेम्स विल्सन

1
मुझे एक्सटेंशन मेथड बहुत पसंद था। मुझे बचाया।
न्यूटन शेख

यहां दी गई वैकल्पिक प्रतिक्रिया जो रेगेक्स को stackoverflow.com/a/28788382/285795 से
17megaMan

इसे मेरे लिए तय किया। मेरे पास एक स्लैश था। एक छद्म यौगिक कुंजी के लिए एक अच्छे चरित्र की तरह लगता है।
रिचार्ड

यह विस्तार विधि कई चैराहों को नहीं हटा रही है जिन्हें अनुमति नहीं है। जैसे: स्थान, "(", ")" ... docs.microsoft.com/en-us/rest/api/storageservices/…
Tiago Andrade e Silva

6

मुझे उसी मुद्दे का सामना करना पड़ा लेकिन मेरे मामले में इसका कारण आकार था। अतिरिक्त अपवाद गुणों में खोदने के बाद (RequestInformation.ExtendedErrorInformation), कारण पाया:

ErrorCode: PropertyValueTooLarge ErrorMessage: संपत्ति का मूल्य अधिकतम अनुमत आकार (64KB) से अधिक है। यदि संपत्ति का मूल्य एक स्ट्रिंग है, तो यह UTF-16 एन्कोडेड है और वर्णों की अधिकतम संख्या 32K या उससे कम होनी चाहिए।


5

ठीक है, मेरे मामले में मैं यह करने की कोशिश कर रहा था:

CloudBlobContainer container = blobClient.GetContainerReference("SessionMaterials");
await container.CreateIfNotExistsAsync();

कंटेनरनाम SessionMaterials(पास्कल केस एंड कैमल केस: डी में लिखने की आदत के कारण) के कारण यह 400 खराब अनुरोध था। इसलिए, मुझे इसे बनाना है sessionmaterials। और यह काम किया।

आशा है कि यह कुछ मदद करता है।

पुनश्च: - बस अपवाद http प्रतिक्रिया की जाँच करें या अनुरोध और प्रतिक्रिया पर कब्जा करने के लिए फ़िडलर का उपयोग करें।


3

मेरे मामले में: कंटेनर का नाम बड़े अक्षर में था। वर्णों का उपयोग करते समय सीमाएँ हैं। यहां छवि विवरण दर्ज करें


यह टेबल प्रॉपर्टी के नाम के लिए भी जाता है।
इयान


1

सभी तालिका सेवा त्रुटि कोड के बारे में एमएस से एक प्रलेखन यहां पाया जा सकता है


1

मेरे पास एक ही BadRequest (400) त्रुटि थी, अंत में मैं मैन्युअल रूप से भरता हूं:

यहां छवि विवरण दर्ज करें

और मेरे लिए काम किया। उम्मीद है की यह मदद करेगा!


यह उत्तर सही है। मैंने लगभग एक घंटे बर्बाद किया और यह पता चला कि Timestampमैन्युअल रूप से भी उत्पन्न होना चाहिए। इससे वाकई बहुत गुस्सा आता है।
रोमन कोलीआडा

0

मुझे भी इसी तरह के मुद्दे का सामना करना पड़ा। मेरे मामले में PartitionKey मान सेट नहीं किया गया था, इसलिए डिफ़ॉल्ट रूप से PartitionKey मान शून्य था, जिसके परिणामस्वरूपObject reference not set to an instance of an object. अपवाद था

जाँचें कि क्या आप विभाजन के लिए उचित मान प्रदान कर रहे हैं या रोके, आपको ऐसी समस्या का सामना करना पड़ सकता है।


0

मैंने अपने मामले तय किए और यह ठीक रहा

मेरे मामले:

  1. पंक्ति कुंजी सही प्रारूप (400) में नहीं है।
  2. विभाजन और रोकी का संयोजन अद्वितीय नहीं है (409)।

0

मुझे 400 बैड रिक्वेस्ट मिल रही थी क्योंकि मैं ZRS (जोन रिडंडेंट स्टोरेज) का उपयोग कर रहा था, और Analytics इस प्रकार के स्टोरेज के लिए उपलब्ध नहीं है। मुझे पता नहीं था कि मैं Analytics का उपयोग कर रहा हूं।

मैंने स्टोरेज कंटेनर को हटा दिया और जीआरएस के रूप में फिर से बनाया और अब यह ठीक काम करता है।


0

मुझे एक (400) खराब अनुरोध, स्टेटस मेसेजेज: बैड रिक्वेस्ट, एररकोड मिल रहा था: जब एक प्रॉपर्टी डेटटाइम सेट नहीं की गई थी तो OutOfRangeInput (= DateTime.MinValue)


0

मेरे मामले में: मैंने बूँद मेटाडाटा को एक टैग नाम के साथ शामिल किया है जिसमें एक हाइफ़न है।

var blob = container.GetBlockBlobReference(filename);
blob.Metadata.Add("added-by", Environment.UserName);
//.. other metadata
blob.UploadFromStream(filestream);

डैश में "added-by"समस्या थी, और बाद में RTFM ने मुझे बताया कि टैग नामों को C # पहचानकर्ता सम्मेलनों के अनुरूप होना चाहिए।

Ref: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-properties-metataata

अंडरस्कोर ठीक काम करता है।


0

मेरे मामले में, मुझे अपनी इकाई वर्ग में पार्टीशनके और रोकी को नहीं जोड़ना चाहिए। यह बेस क्लास से होना चाहिए। नीचे बस काम होगा।

public class TableRunLogMessage:TableEntity
{
      public string status { get; set; }
      public long logged { get; set; }


      public TableRunLogMessage() { }
}

0

यदि आप NodeJS का उपयोग कर रहे हैं और इस पोस्ट पर ठोकर खाई है, केवल यह खोजने के लिए कि आपको अपनी त्रुटि वस्तु में वह प्यारी विस्तृत जानकारी नहीं मिली है; आप उन विवरणों को प्राप्त करने के लिए एक प्रॉक्सी का उपयोग कर सकते हैं। हालाँकि, चूंकि किसी ने भी प्रॉक्सी का उपयोग करने के लिए HOW का उल्लेख नहीं किया है।

NodeJS के साथ सबसे सरल तरीका दो पर्यावरण चर सेट करके है:

NODE_TLS_REJECT_UNAUTHORIZED=0
This disables SSL checks so you can intercept your own SSL requests. This leaves you open to Man-in-The-Middle attacks and should NEVER make it to production, and I wouldn't even leave it in development for long. However, it will allow you to intercept the HTTP Requests.

HTTP_PROXY=http://127.0.0.1:8888
This sets node to utilize a proxy listening on your localhost at port 8888. Port 8888 is the default for Fiddler. Many other proxies default to 8080.

यदि आप वास्तव में C # का उपयोग कर रहे हैं, जैसे इस पोस्ट के लेखक कर रहे हैं; आप बस फिडलर स्थापित कर सकते हैं और इसे इंटरसेप्ट करने के लिए सेट कर सकते हैं। डिफ़ॉल्ट रूप से यह अनुरोधों को रोकना चाहिए। आपको फ़िडलर के प्रमाणपत्र पर भरोसा करने की आवश्यकता हो सकती है या अन्यथा नोड के "NODE_TLS_REJECT_UNAUTHORIZED = 0" के बराबर करना चाहिए।


0

मुझे Azure Storage Account Table API से 400-BadRequest प्रतिक्रिया मिली। अपवाद जानकारी से पता चला कि "एक्सेस किया जा रहा खाता http का समर्थन नहीं करता है।" मुझे लगा कि हमें कनेक्शन स्ट्रिंग में https का उपयोग करना चाहिए जब "सुरक्षित ट्रांसफर आवश्यक" स्टोरेज अकाउंट कॉन्फ़िगरेशन में सक्षम होता है जैसा कि नीचे की छवि में दिखाया गया है।यहां छवि विवरण दर्ज करें


0

"TableBotDataStore" वर्ग (MS बॉट फ्रेमवर्क) के नए इंस्टाल्न बनाने के लिए मेरे मामले में हम "टेबल-नेम" पैरामीटर को "मास्टर-बॉट" की तरह हाइफ़न के साथ पास करते हैं और TableBotDataStore में केवल अक्षरों और संख्याओं के साथ टेबल के नाम हो सकते हैं


0

मेरे पास एक ही मुद्दा था, फ़ंक्शन containerNameKeyस्ट्रिंग के रूप में गुजर रहा था । नीचे वह कोड दिया गया है जिसमें त्रुटि दी गई है

container = blobClient.GetContainerReference(containerNameKey) 

मैंने इसे बदल दिया

container = blobClient.GetContainerReference(ConfigurationManager.AppSettings(containerNameKey).ToString()) 

इसने काम कर दिया

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.