2013-02-21 140 views
16

मैंने जीईटी विधि के साथ jQuery AJAX कॉल के माध्यम से डब्ल्यूसीएफ सेवा तक पहुंचने का प्रयास किया। इसलिए, कभी-कभी यूआरएल पैरामीटर के साथ लंबा होता है।डब्ल्यूसीएफ प्राप्त यूआरएल लंबाई सीमा मुद्दे: खराब अनुरोध - अमान्य यूआरएल

जब पैरामीटर इतना लंबा हो जाता है, तो jQuery AJAX कॉल विफल रहता है, और कुछ भी नहीं देता है। इसलिए मैंने ब्रेक प्वाइंट लगाया और यूआरएल को परीक्षण के लिए बाहर निकाला। जब मैं ब्राउज़र में एक ही यूआरएल का प्रयास करता हूं (मैंने फ़ायरफ़ॉक्स और क्रोम की कोशिश की), तो यूआरएल की लंबाई बहुत लंबी होने पर यह निम्न लौटाती है।

गलत अनुरोध - अमान्य URL

HTTP त्रुटि 400 अनुरोध URL अमान्य है।

मैंने लंबाई सीमा भी जांच की। जब यूआरएल (एन्कोडेड प्रारूप में) में वर्णों की संख्या 1011 वर्णों (http: // सहित) से अधिक है तो मुझे केवल त्रुटि मिलती है।

किसी के पास एक ही स्थिति है और इसे कोई समाधान मिला है? क्या यह विंडोज सीमा है या इसे प्रोग्रामेटिक रूप से किसी भी सेटिंग्स के माध्यम से प्रबंधित किया जा सकता है?

मैंने पोस्ट विधि की कोशिश की, लेकिन मुझे नहीं पता कि मैं इसे काम नहीं कर सका। क्योंकि इसे कुछ web.config परिवर्तनों की आवश्यकता है।

संपादित

यूआरएल मैं त्रुटि URL के

http://localhost:64973/Member.svc/SaveMemberWithDetail/%7B%22ID%22%7C%222%22,%22TypeID%22%7C%222%22,%22Title%22%7C%22Mr.%22,%22FirstName%22%7C%22Firnas%22,%22MiddleName%22%7C%22%22,%22LastName%22%7C%22Aliyar%22,%22Gender%22%7C%221%22,%22DateOfBirth%22%7C%222000-01-01%22,%22Nationality%22%7C%22Sri%20Lankan%22%7D/%5B%7B%22AddressLine1%22%7C%22Changed%20Address%20Line1%22,%22AddressLine2%22%7C%22Colombo%22,%22City%22%7C%22Colombo%2010%22,%22State%22%7C%22WP%22,%22PostCode%22%7C%2201000%22,%22CountryID%22%7C%221%22,%22ID%22%7C%227%22,%22TypeID%22%7C%221%22%7D%5D/%5B%7B%22Telephone%22%7C%22015154645%22,%22TypeID%22%7C%221%22%7D%5D/%5B%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2226%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2227%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2228%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2229%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2229%22,%22TypeID%22%7C%221%22%7D%5D/%7B%7D/481 

unencoded संस्करण उत्पन्न करने के लिए परीक्षण किया गया है:

http://localhost:64973/Member.svc/SaveMemberWithDetail/{"ID"|"2","TypeID"|"2","Title"|"Mr.","FirstName"|"Firnas","MiddleName"|"","LastName"|"Aliyar","Gender"|"1","DateOfBirth"|"2000-01-01","Nationality"|"Sri Lankan"}/[{"AddressLine1"|"Changed Address Line1","AddressLine2"|"Colombo","City"|"Colombo 10","State"|"WP","PostCode"|"01000","CountryID"|"1","ID"|"7","TypeID"|"1"}]/[{"Telephone"|"015154645","TypeID"|"1"}]/[{"EmailAddress"|"[email protected]","ID"|"26","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"27","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"28","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"29","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"29","TypeID"|"1"}]/{}/481 

मेरे पैरामीटर JSON ऑब्जेक्ट की तैयारी में हैं। मुझे नहीं लगता कि किसी भी पात्र समस्या का कारण बनते हैं, क्योंकि, अगर मैं कुछ अल्फा न्यूमेरिक वर्णों को सीमा से कम करने के लिए कम करता हूं, तो यह काम करता है।

मैं विंडोज 8 प्रोफेशनल में विजुअल स्टूडियो 2012 प्रीमियम में अपना एप्लिकेशन चला रहा हूं, इसलिए यह .NET 4.5 और आईआईएस एक्सप्रेस इसके साथ आया है।

आगे अनुसंधान

जब मैं इसकी जांच करने की कोशिश, इस सीमा मैं पहले से ही उल्लेख किया है जो पूर्ण यूआरएल की लंबाई है नहीं है। लेकिन, प्रत्येक पैरामीटर में लंबाई की सीमा है जो 260 वर्ण है।

तो, मुझे यूआरएल की कुल लंबाई के बारे में निश्चित नहीं है, लेकिन प्रत्येक पैरामीटर ("/" से अलग) की सीमा है। मैंने ऊपर दिए गए यूआरएल के साथ समस्या ईमेल पता JSON पैरामीटर 261 वर्ण लंबा है, नीचे दिया गया है।

[{"EmailAddress"|"[email protected]","ID"|"26","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"27","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"28","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"29","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"29","TypeID"|"1"}] 

यदि मैं इससे 1 वर्ण हटा देता हूं, तो यह काम करता है।

क्या यह ब्राउज़र सीमा है? ओएस सीमा?

अद्यतन: समाधान

मैं एक समाधान जो मेरे लिए काम किया, जब मैं इस पर आगे शोध में पाया। मैं यहां अपडेट कर रहा हूं क्योंकि यह उन लोगों के लिए उपयोगी हो सकता है जो इस प्रश्न में आते हैं।

यह एक आईआईएस

समस्या है, क्योंकि बाकी यूआरएल में प्रत्येक पैरामीटर के डिफ़ॉल्ट अक्षरों की सीमा 260 जो रजिस्ट्री में परिभाषित किया जाता है की स्थापना है।

तो, आपको इस आकार सीमा को बढ़ाने के लिए रजिस्ट्री को अद्यतन करना होगा जहां आईआईएस सर्वर/आईआईएस एक्सप्रेस चल रहा है।

निम्न रजिस्ट्री का स्थान है:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters 

और मान का नाम UrlSegmentMaxLength है। यदि यह वहां नहीं है, तो REG_DWORD के प्रकार के साथ एक बनाएं। और value data जैसे हेक्साडेसिमल में 1000 या दशमलव में 4096 के लिए उच्च मान निर्दिष्ट करें।

यह एक http.sys सेटिंग है। Http.sys सेटिंग्स के बारे में अधिक जानकारी: http://support.microsoft.com/kb/820129

सुनिश्चित करें कि आप रजिस्ट्री परिवर्तनों को लागू करने के लिए सर्वर/मशीन को पुनरारंभ करें। और यही वह है।

+1

"अद्यतन: समाधान" मेरे लिए काम करता है। फिमा, अगर आप अभी भी आसपास हैं, तो अगर आप अपने प्रश्न के उस खंड को उत्तर के रूप में पोस्ट करना चाहते हैं, तो मैं खुशी से इसे उखाड़ फेंक दूंगा। –

+1

निश्चित दोस्त। यह सुनकर खुशी हुई कि मेरा समाधान मेरे लिए काम करता है। :) – Firnas

+0

अद्यतन समाधान काम करता है। यह अभी भी PHP 5.6 और सर्वर 2012 R2 – FunkeDope

उत्तर

8

उत्तर के रूप में अद्यतन को दोबारा पोस्ट करना, क्योंकि आप में से कुछ सीधे उत्तर अनुभाग में कूद सकते हैं।

मुझे एक समाधान मिला जो मेरे लिए काम करता था, जब मैं इस पर आगे शोध करता हूं। मैं यहां अपडेट कर रहा हूं क्योंकि यह उन लोगों के लिए उपयोगी हो सकता है जो इस प्रश्न में आते हैं।

यह एक आईआईएस

स्थापना, क्योंकि बाकी यूआरएल में प्रत्येक पैरामीटर के डिफ़ॉल्ट अक्षरों की सीमा 260 जो रजिस्ट्री में परिभाषित किया जाता है समस्या है।

तो, आपको इस आकार सीमा को बढ़ाने के लिए रजिस्ट्री को अद्यतन करना होगा जहां आईआईएस सर्वर/आईआईएस एक्सप्रेस चल रहा है।

निम्न रजिस्ट्री के स्थान जाता है:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ सेवाओं \ HTTP \ पैरामीटर और मान का नाम UrlSegmentMaxLength है। यदि यह वहां नहीं है, तो REG_DWORD के प्रकार के साथ एक बनाएं। और वैल्यू डेटा के लिए उच्च मान निर्दिष्ट करें जैसे कि हेक्साडेसिमल में 1000 या दशमलव में 4096।

यह एक http.sys सेटिंग है। Http.sys सेटिंग्स के बारे में अधिक जानकारी: http://support.microsoft.com/kb/820129

सुनिश्चित करें कि आप रजिस्ट्री परिवर्तनों को लागू करने के लिए सर्वर/मशीन को पुनरारंभ करें। और बस।

2

कुछ बातें सोचने के लिए के बारे में:

1) आप, डेटा की बचत कर पोस्ट का उपयोग जब संभव करने के लिए एक प्राप्त उपयोग नहीं करना चाहिए। मुख्य कारण सुरक्षा के साथ करना है। जीईटी का उपयोग करके आप अधिक संभावित सीएसआरएफ हमलों तक खुल जाते हैं। ध्यान रखें कि पोस्ट सीएसआरएफ से प्रतिरक्षा नहीं है, लेकिन इसका उपयोग करने से कमजोरता कम हो जाती है।

2) यूआरएल को देखते हुए, कॉमा मेरे लिए जगह से बाहर निकलते हैं और हो सकता है कि आपको अमान्य यूआरएल त्रुटियां मिल रही हैं।

3) आईआईएस का कौन सा संस्करण आप चल रहे हैं? यह निर्धारित कर सकता है कि अधिकतम URL लंबाई बढ़ाने के लिए आपको क्या करना है।

IIS7 के लिए आप कॉन्फ़िग फ़ाइल में System.Web के लिए जोड़ सकते हैं:

<httpRuntime maxUrlLength="2000" /> 

संपादित करें:

के रूप में यह यह मानचित्रण का प्रयास नहीं करेंगे आप इसे एक पोस्ट करने के लिए फिर से बदलने का प्रयास करना चाहिए एक फाइल सिस्टम के लिए।

MSDN से Windows API केवल अनुमति देता है 260.

Windows API में, एक पथ के लिए अधिकतम लंबाई MAX_PATH, जो है है 260 के रूप में परिभाषित (कुछ अपवादों को छोड़कर निम्नलिखित पैराग्राफ में चर्चा के साथ) वर्ण। निम्नलिखित क्रम में एक स्थानीय पथ संरचित किया गया है: ड्राइव अक्षर, कोलन, बैकस्लैश, बैकस्लैश से अलग नाम घटक, और एक निरंतर शून्य वर्ण। उदाहरण के लिए, ड्राइव डी पर अधिकतम पथ "डी: \ कुछ 256-वर्ण पथ स्ट्रिंग" है जहां " वर्तमान सिस्टम कोडपृष्ठ के लिए अदृश्य टर्मिनल शून्य वर्ण का प्रतिनिधित्व करता है। (वर्ण <> दृश्य स्पष्टता के लिए यहां उपयोग किए जाते हैं और वैध पथ स्ट्रिंग का हिस्सा नहीं हो सकते हैं।)

+0

के साथ काम कर रहा है मेरा संपादन देखें, आगे की शोध जानकारी जोड़ दी गई है। – Firnas

+0

मैं आपके द्वारा जमा करने के लिए बड़ी मात्रा में डेटा जमा करने के बजाय जीईटी के बजाय POST का उपयोग करने पर सहमत हूं। – Firnas

0

ऊपर समाधान के साथ मेरे लिए काम किया:

maxQueryStringLength = "3000" maxUrlLength = "3000"

और रजिस्ट्री ऊपर ठीक।

1

संपादन regestry यह बुरा अनुरोध 400 की मेरी समस्या हल, लेकिन stil मेरे लिए काम नहीं करता है जब तक मैं जोड़ा रखकर

<httpRuntime maxUrlLength="6144" relaxedUrlToFileSystemMapping="true" /> 
टिप्पणी के लिए मैं अपने

regestry संपादित करने से पहले इस विन्यास को जोड़ने के लिए tryed लेकिन यह काम नहीं करता है इसलिए मुझे लगता है कि रीजस्ट्री को संपादित करने के बाद और इस कॉन्फ़िगरेशन के साथ मैंने इसे अच्छी तरह से सेट किया है। यह किसी और की मदद कर सकता है।

1

पूर्णता के लिए सिर्फ एक और उत्तर जोड़ना।

<system.web> 
    ... 
     <!--Make sure to keep maxAllowedContentLength and maxRequestLength are in Synch--> 
     <!--This is for ASP.NET and is in KBytes--> 
     <httpRuntime maxRequestLength="50000" maxUrlLength="3000" maxQueryStringLength="3000"/> 
    </system.web> 
... 
    <system.webServer> 
    <security> 
     <requestFiltering> 
     <!--This is for IIS7+ and is in Bytes (Equivalent to 50MB)--> 
     <requestLimits maxAllowedContentLength="52428800" maxQueryString="3000" /> 
     </requestFiltering> 
    </security> 
    </system.webServer> 
... 

हालांकि, मैं अभी भी 400 त्रुटि आईआईएस सर्वरों में से एक पर हो रही थी: मेरे मामले में मैं web.config में सब ठीक मूल्यों था। अधिक जांच और कॉन्फ़िगरेशन तुलना के बाद यह पता चला कि UrlScan IIS मॉड्यूल अपराधी था। मॉड्यूल को अनइंस्टॉल करके या अधिकतम लंबाई मान संशोधित करने के लिए UrlScan.ini फ़ाइल को संपादित करके समस्या हल हो गई है:

... 
[RequestLimits] 
MaxAllowedContentLength=104857600 
MaxUrl=3000 
MaxQueryString=3000