2013-02-21 18 views
16

Ho provato ad accedere a un servizio WCF tramite chiamata jQuery AJAX con metodo GET. Quindi, a volte l'URL è lungo con parametri.WCF GET Lunghezza limite URL Problema: Richiesta non valida - URL non valido

Quando i parametri diventano così lunghi, jQuery AJAX Call non riesce e non restituisce nulla. Quindi ho inserito un punto di interruzione e ho ritirato l'URL per testarlo. Quando provo lo stesso URL nel browser (ho provato FireFox e Chrome), restituisce quanto segue quando la lunghezza dell'URL è troppo lunga.

Bad Request - URL non valido

HTTP Error 400. L'URL richiesta non è valida.

Ho controllato anche il limite di lunghezza. Quando il numero di caratteri nell'URL (in formato codificato) supera 1011 caratteri (incluso http: //), ottengo solo l'errore.

Chiunque ha la stessa situazione e ha trovato una soluzione a questo? È una limitazione di Windows o può essere gestita da qualsiasi impostazione a livello di programmazione?

Ho provato il metodo POST, ma non so che non potrei farlo funzionare. Perché ha bisogno di alcune modifiche web.config.

EDIT

L'URL ho provato a generare l'errore

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]gogle.com%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 

versione non codificata di URL:

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 

i miei parametri sono impostati di JSON oggetti. Non penso che nessuno dei personaggi causi il problema, perché, se riduco solo pochi caratteri alfanumerici a meno del limite, funziona.

Sto eseguendo la mia applicazione in Visual Studio 2012 Premium in Windows 8 Professional, quindi è .NET 4.5 e IIS Express Came con esso.

ulteriori ricerche

Quando cerco di indagare ulteriormente, questo non è il limite che ho già citato, che è la lunghezza del URL completo. Ma c'è una limitazione di lunghezza in ogni parametro che è di 260 caratteri.

Quindi, non sono sicuro della lunghezza totale dell'URL, ma ogni parametro (separato da "/") ha il limite. Il problema con l'URL precedente che ho pubblicato è il parametro JSON dell'indirizzo email è lungo 261 caratteri, indicato di seguito.

[{"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"}] 

Se elimino 1 carattere da questo, funziona.

È la limitazione del browser? Limitazione OS?

UPDATE: SOLUZIONE

ho trovato una soluzione che ha funzionato per me, quando ho ulteriori ricerche su questo. Sto aggiornando qui poiché potrebbe essere utile per gli altri che si imbattono in questa domanda.

Questo è un IIS Impostazione

Il problema è che, il limite di caratteri di default di ogni parametro in REST url è 260 che è definito nel Registro di sistema.

Pertanto, è necessario aggiornare il registro per aumentare questo limite di dimensioni in cui è in esecuzione IIS Server/IIS Express.

In seguito è la posizione della barca:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters 

E il nome del valore è UrlSegmentMaxLength. Se non è lì, creane uno con Tipo di REG_DWORD. E specificare un valore superiore per value data come 1000 in esadecimale o 4096 in decimale.

Questa è un'impostazione http.sys. Ulteriori informazioni sulle impostazioni http.sys: http://support.microsoft.com/kb/820129

Assicurarsi di riavviare il server/macchina per applicare le modifiche al registro. E questo è tutto.

+1

"UPDATE: SOLUTION" ha funzionato per me. Fimas, se sei ancora in giro, se vuoi postare quella sezione della tua domanda come risposta, lo farei felicemente. –

+1

Sicuro amico. Sono felice di sentire che la mia soluzione ha funzionato per me. :) – Firnas

+0

La soluzione di aggiornamento funziona. Funziona ancora con PHP 5.6 e Server 2012 R2 – FunkeDope

risposta

8

Ripubblicare l'aggiornamento come Risposta, poiché alcuni di voi potrebbero passare direttamente alla sezione Risposte.

Ho trovato una soluzione che ha funzionato per me, quando ho approfondito la ricerca. Sto aggiornando qui poiché potrebbe essere utile per gli altri che si imbattono in questa domanda.

Questo è un IIS Impostazione

Il problema è che, il limite di caratteri di default di ogni parametro in REST url è 260 che è definito nel Registro di sistema.

Pertanto, è necessario aggiornare il registro per aumentare questo limite di dimensioni in cui è in esecuzione IIS Server/IIS Express.

seguito è riportato il percorso del Registro di sistema:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ HTTP \ Parameters E il nome del valore è UrlSegmentMaxLength. Se non è lì, crearne uno con Type of REG_DWORD. E specificare un valore più alto per dati di valore come 1000 in esadecimale o 4096 in decimale.

Questa è un'impostazione http.sys. Ulteriori informazioni sulle impostazioni http.sys: http://support.microsoft.com/kb/820129

Assicurarsi di riavviare il server/macchina per applicare le modifiche al registro. E questo è tutto.

2

Un paio di cose a cui pensare:

1) Non si dovrebbe usare un GET per fare il salvataggio dei dati, utilizzare POST quando possibile. La ragione principale ha a che fare con la sicurezza. L'utilizzo di GET ti apre a più potenziali attacchi CSRF. Tieni presente che il POST non è immune a CSRF, ma usarlo riduce un po 'la vulnerabilità.

2) Osservando l'URL, le virgole sembrano fuori luogo per me e potrebbero essere il motivo per cui si ricevono errori URL non validi.

3) Quale versione di IIS stai utilizzando? Questo potrebbe determinare cosa devi fare per aumentare la lunghezza massima dell'URL.

Per IIS7 si potrebbe aggiungere al System.Web nel file di configurazione:

<httpRuntime maxUrlLength="2000" /> 

EDIT:

Si dovrebbe provare a cambiare in un messaggio di nuovo in quanto non provare a mappare lo a un file system.

Dalla MSDN API Windows consente solo 260.

Nella API di Windows (con alcune eccezioni descritti nei seguenti paragrafi ), la lunghezza massima per un percorso è MAX_PATH, che è definiti 260 personaggi. Un percorso locale è strutturato nel seguente ordine : lettera di unità, due punti, barra rovesciata, componenti nome separati da barre rovesciate e un carattere null di chiusura. Ad esempio, il percorso massimo nell'unità D è "D: \ una stringa di percorso di 256 caratteri" dove "" rappresenta il carattere nullo di chiusura invisibile per la codepage di sistema corrente. (I caratteri <> vengono utilizzati qui per la chiarezza visiva e non possono far parte di una stringa di percorso valida.)

+0

Vedere la mia modifica, vengono aggiunte ulteriori informazioni di ricerca. – Firnas

+0

Sono d'accordo con te sull'uso del POST anziché di GET per inviare una grande quantità di dati da inserire. – Firnas

0

La soluzione di cui sopra ha funzionato per me con:

maxQueryStringLength = "3000" maxUrlLength = "3000"

E il Registro di fissare sopra.

1

Modificando il regestry ha risolto il mio problema del cattivo Request 400, ma stil non funziona per me fino a quando ho aggiunto,

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

per la nota Ho cercato di aggiungere questa configurazione prima di modificare la mia regestry ma non ha funzionato quindi credo che dopo aver modificato il Regestry e con questa configurazione l'ho impostato bene. può aiutare qualcun altro.

1

Aggiunta di un'altra risposta solo per completezza. Nel mio caso ho avuto tutti i valori giusti nel 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> 
... 

Tuttavia, ero ancora ottenere l'errore 400 su uno dei server IIS. Dopo ulteriori analisi e confronti di configurazione, è risultato che il modulo IIS di UrlScan era il colpevole. Disinstallando il modulo o modificando il file UrlScan.ini per modificare i valori di lunghezza massima il problema è stato risolto:

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