2013-02-21 1 views
16

J'ai essayé d'accéder à un service WCF via l'appel jQuery AJAX avec la méthode GET. Ainsi, parfois l'URL est longue avec des paramètres.WCF GET Limite de longueur d'URL Problème: Demande incorrecte - URL non valide

Lorsque les paramètres deviennent trop longs, l'appel jQuery AJAX échoue et ne renvoie rien. J'ai donc mis un point d'arrêt et sorti l'URL pour tester. Lorsque j'essaie la même URL dans le navigateur (j'ai essayé FireFox et Chrome), il renvoie ce qui suit lorsque la longueur de l'URL est trop longue.

Bad Request - URL non valide

Erreur HTTP 400. L'URL de la requête est invalide.

J'ai également vérifié la limite de longueur. Lorsque le nombre de caractères dans l'URL (au format encodé) dépasse 1011 caractères (y compris http: //), seule l'erreur apparaît.

Quelqu'un a-t-il la même situation et a-t-il trouvé une solution? Est-ce Windows Limitation ou Peut-il être géré par des paramètres par programmation?

J'ai essayé la méthode POST, mais je ne sais pas que je ne pouvais pas le faire fonctionner. Parce qu'il a besoin de quelques modifications web.config.

EDIT

L'URL que j'ai testé pour générer l'erreur

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]d%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 

Version non codé d'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 

Mes paramètres sont un ensemble d'objets JSON. Je ne pense pas que l'un des personnages cause le problème, parce que, si je réduis juste quelques caractères alphanumériques à moins de la limite, cela fonctionne. Je cours mon application dans Visual Studio 2012 Premium dans Windows 8 Professionnel, donc c'est .NET 4.5 et IIS Express Came avec elle.

Ressources complémentaires

Lorsque je tente d'enquêter plus loin, ce n'est pas la limitation que je l'ai déjà mentionné, qui est la longueur de l'URL complète. Mais, il y a une limite de longueur dans chaque paramètre qui est de 260 caractères. Donc, je ne suis pas sûr de la longueur totale de l'URL, mais chaque paramètre (séparé par "/") a la limite. Le problème avec l'URL ci-dessus que j'ai posté est le paramètre Adresse email JSON est de 261 caractères, donnés ci-dessous.

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

Si je supprime 1 caractère de cela, cela fonctionne.

Est-ce la limitation du navigateur? Limitation OS?

MISE À JOUR: SOLUTION

j'ai trouvé une solution qui a fonctionné pour moi, quand je fais des recherches plus loin sur ce point. Je suis en train de mettre à jour ici car cela pourrait être utile pour d'autres personnes qui rencontrent cette question.

C'est un IIS Réglage

Le problème est dû au fait, la limite de caractères par défaut de chaque paramètre dans REST url est 260 qui est défini dans le Registre. Par conséquent, vous devez mettre à jour le Registre pour augmenter cette limite de taille lorsque le serveur IIS/IIS Express est en cours d'exécution.

suivant est l'emplacement du Registre:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters 

Et le nom de la valeur est UrlSegmentMaxLength. Si ce n'est pas le cas, créez-en un avec le type REG_DWORD. Et spécifiez une valeur plus élevée pour value data, par exemple 1000 en hexadécimal ou 4096 en décimal.

Il s'agit d'un paramètre http.sys. Pour en savoir plus sur les paramètres http.sys: http://support.microsoft.com/kb/820129

Assurez-vous de redémarrer le serveur/l'ordinateur pour appliquer les modifications du registre. Et c'est tout.

+1

La « MISE À JOUR: SOLUTION » a fonctionné pour moi. Fimas, si vous êtes encore là, si vous voulez poster cette section de votre question comme réponse, je serais ravi d'y revenir. –

+1

Bien sûr mec. Heureux d'entendre que ma solution a fonctionné pour moi. :) – Firnas

+0

La solution de mise à jour fonctionne. Cela fonctionne toujours avec PHP 5.6 et Server 2012 R2 – FunkeDope

Répondre

8

Repositionnez la mise à jour en tant que Réponse, car certains d'entre vous peuvent accéder directement à la section Réponses.

J'ai trouvé une solution qui a fonctionné pour moi, quand je recherche plus loin à ce sujet. Je suis en train de mettre à jour ici car cela pourrait être utile pour d'autres personnes qui rencontrent cette question.

C'est un IIS Réglage

Le problème est dû au fait, la limite de caractères par défaut de chaque paramètre dans REST url est 260 qui est défini dans le Registre. Par conséquent, vous devez mettre à jour le Registre pour augmenter cette limite de taille lorsque le serveur IIS/IIS Express est en cours d'exécution.

suivant est l'emplacement du Registre:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ HTTP \ Parameters Et le nom de la valeur est UrlSegmentMaxLength. Si ce n'est pas le cas, créez-en un avec le type de REG_DWORD. Et spécifiez une valeur plus élevée pour les données de valeur telles que 1000 en hexadécimal ou 4096 en décimal.

Il s'agit d'un paramètre http.sys. Pour en savoir plus sur les paramètres http.sys: http://support.microsoft.com/kb/820129

Assurez-vous de redémarrer le serveur/l'ordinateur pour appliquer les modifications du Registre. Et c'est tout. Ajouter une autre réponse juste pour l'exhaustivité.

2

Un couple de choses à penser:

1) Vous ne devriez pas utiliser un GET pour faire l'enregistrement des données, utilisez POST lorsque cela est possible. La raison principale a à voir avec la sécurité. L'utilisation de GET vous ouvre à plus d'attaques CSRF potentielles. Gardez à l'esprit que POST n'est pas immunisé contre CSRF, mais son utilisation réduit un peu la vulnérabilité.

2) En regardant l'URL, les virgules ne me semblent pas à ma place et pourraient expliquer pourquoi vous avez des erreurs d'URL invalides.

3) Quelle version d'IIS utilisez-vous? Cela peut déterminer ce que vous devez faire pour augmenter la longueur maximale de l'URL.

Pour IIS7, vous pouvez ajouter à System.Web dans le fichier de configuration:

<httpRuntime maxUrlLength="2000" /> 

EDIT:

Vous devriez essayer de changer à nouveau à un poste car il ne tentera pas la plaquant à un système de fichiers.

De MSDN les fenêtres api permet seulement 260.

Dans l'API Windows (avec quelques exceptions décrites dans les paragraphes suivants ), la longueur maximale d'un chemin est MAX_PATH, qui est défini comme 260 personnages. Un chemin local est structuré dans l'ordre suivant: lettre de lecteur, deux-points, barre oblique inverse, composants de nom séparés par barres obliques inverses et un caractère null de fin. Par exemple, le chemin maximum sur le lecteur D est "D: \ une chaîne de chemin d'accès de 256 caractères" où "" représente le caractère nul final nul pour la page de codes système en cours. (Les caractères <> sont utilisés ici pour la clarté visuelle et ne peuvent pas faire partie d'une chaîne de chemin valide.)

+0

Voir ma modification, d'autres informations de recherche sont ajoutées. – Firnas

+0

Je suis d'accord avec vous sur l'utilisation de POST au lieu de GET pour soumettre une grande quantité de données à mettre. – Firnas

0

La solution ci-dessus a fonctionné pour moi avec:

maxQueryStringLength = "3000" maxUrlLength = "3000"

Et le registre fix ci-dessus.

1

En éditant le regestry il a résolu mon problème de la mauvaise demande 400, mais ne Stil fonctionne pas pour moi jusqu'à ce que j'ajouté,

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

pour la note i tryed pour ajouter cette configuration avant de modifier mon regestry mais ça n'a pas fonctionné, donc je suppose qu'après avoir édité le Regestry et avec cette configuration je l'ai bien mis en place. peut-il aider quelqu'un d'autre.

1

Dans mon cas, j'avais toutes les bonnes valeurs dans 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> 
... 

Cependant, je suis encore en train de la 400 erreur sur l'un des serveurs IIS. Après plus d'enquête et de comparaison de configuration, il s'est avéré que le module UrlScan IIS était le coupable. En désinstallant le module ou la modification du fichier UrlScan.ini pour modifier les valeurs de longueur max le problème a été résolu:

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