2013-02-21 56 views
16

我試圖通過使用GET方法的jQuery AJAX調用訪問WCF服務。所以,有時候這個URL很長,帶有參數。WCF GET URL長度限制問題:錯誤的請求 - 無效的URL

當參數變得如此冗長時,jQuery AJAX調用失敗,並且不返回任何內容。所以我放了一個斷點,並拿出了URL來測試。當我在瀏覽器中嘗試相同的URL(我嘗試使用FireFox和Chrome)時,當URL長度過長時,它會返回以下內容。

錯誤的請求 - 無效的URL

HTTP 400錯誤的請求URL無效。

我也檢查了長度限制。當URL中的字符數(以編碼格式)超過1011個字符(包括http://)時,只會出現錯誤。

任何人都有相同的情況,並找到解決辦法嗎?是Windows限制還是可以通過任何設置編程管理?

我試過POST方法,但我不知道我無法使它工作。因爲它需要一些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 

非編碼版本的網址:

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對象。我認爲任何角色都不會導致問題,因爲如果我只是將少數字母數字字符減少到小於極限值,就會起作用。

我在Windows 8 Professional的Visual Studio 2012 Premium中運行我的應用程序,所以它的.NET 4.5和IIS Express隨它而來。

進一步研究

當我嘗試進一步調查,這是不是我已經提到的限制是完整的URL的長度。但是,每個參數的長度有260個字符的限制。

所以,我不確定URL的總長度,但每個參數(用「/」分隔)都有限制。我發佈的上述URL的問題是電子郵件地址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個字符,它就會起作用。

是瀏覽器限制嗎?操作系統限制?

UPDATE:解決方案

我發現這工作對我來說,當我進一步研究了一個解決方案。我在這裏更新,因爲它可能對遇到此問題的其他人有用。

這是一個IIS設置

的問題是,因爲在REST URL每個參數的缺省字符限制爲260,其在註冊表中定義。

所以,你必須更新註冊表,以增加在IIS服務器/ IIS Express的運行此大小限制。

以下是註冊表的位置:

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

「更新:解決方案」爲我工作。 Fimas,如果你還在身邊,如果你想把你的問題的那一部分作爲答案發布,我會很高興地提出這個問題。 – 2015-09-05 02:03:08

+1

當然是老兄。很高興聽到我的解決方案爲我工作。 :) – Firnas 2015-09-08 12:08:01

+0

更新解決方案的作品。這仍然與PHP 5.6和服務器2012 R2 – FunkeDope 2015-12-11 18:39:37

回答

8

將更新重新發布爲答案,因爲您可能會直接跳到Answers部分。

我找到了一個適合我的解決方案,當我對此進行進一步研究時。我在這裏更新,因爲它可能對遇到此問題的其他人有用。

這是一個IIS設置

的問題是,因爲在REST URL每個參數的缺省字符限制爲260,其在註冊表中定義。

因此,您必須更新註冊表以增加運行IIS服務器/ IIS Express的此大小限制。

以下是註冊表的位置:

HKEY_LOCAL_MACHINE \系統\ CurrentControlSet \服務\ HTTP \參數 和值的名稱是UrlSegmentMaxLength。如果不存在,請使用REG_DWORD類型創建一個。併爲值數據指定較高的值,如十六進制爲1000或十進制爲4096。

這是一個http.sys設置。有關http.sys設置的更多信息:http://support.microsoft.com/kb/820129

確保您重新啓動服務器/計算機以應用註冊表更改。就是這樣。

2

幾件事情要考慮:

1)你不應該使用GET做數據的保存,儘可能使用POST。主要原因是與安全有關。使用GET可以開啓更多潛在的CSRF攻擊。請記住,POST對CSRF不是免疫的,但使用它會稍微降低漏洞。

2)觀看網址,逗號看的地方給我,可爲什麼你得到無效的URL錯誤。

3)什麼版本的IIS,你下運行?這可能會決定你必須做些什麼來增加最大URL長度。

對於IIS7,你可以在配置文件中添加的System.Web:

<httpRuntime maxUrlLength="2000" /> 

編輯:

你應該嘗試再次更改爲POST,因爲它不會嘗試它映射到文件系統。

MSDN在Windows API僅允許260

在Windows API(在以下 段落中討論一些例外),對於路徑的最大長度爲MAX_PATH,這是 定義爲260字符。本地路徑的結構如下 順序:驅動器號,冒號,反斜槓,由 反斜槓分隔的名稱組件,以及終止空字符。例如,驅動器D上的最大路徑 是「D:\某些256個字符的路徑字符串」 其中「」表示當前系統代碼頁的不可見的終止空字符。 (字符<>在此用於 視覺清晰度,不能是有效路徑字符串的一部分。)

+0

看到我的編輯,進一步的研究信息被添加。 – Firnas 2013-02-21 16:00:31

+0

我同意你使用POST而不是GET來提交大量的數據。 – Firnas 2015-09-09 01:48:17

0

上述解決方案一起工作對我來說:

maxQueryStringLength = 「3000」 maxUrlLength = 「3000」

和書記上述修復。

1

通過編輯它解決了我的壞請求400的問題,但還是老樣子,直到我說不會爲我工作的regestry,

<httpRuntime maxUrlLength="6144" relaxedUrlToFileSystemMapping="true" /> 

做筆記我tryed編輯我regestry之前添加該配置,但它沒有工作,所以我想在編輯Regestry和這個配置後,我設置好了。 它可以幫助別人。

1

添加另一個答案只是爲了完整性。在我來說,我在web.config中所有的正確的價值觀:

<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> 
... 

不過,我仍然得到對IIS服務器的一個400錯誤。經過更多調查和配置比較後發現UrlScan IIS模塊是罪魁禍首。通過卸載模塊或編輯UrlScan.ini文件修改最大長度值,問題已得到解決:

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