2017-09-16 8 views
1

J'ai un point d'extrémité C# Web Api dans un contrôleur qui a un paramètre. Ce paramètre accepte une chaîne cryptée et cette chaîne contiendra des caractères comme "/", "&", "+" etc. Donc, chaque fois que j'appelle mon point de terminaison Api de javascript, je l'encoder en utilisant la fonction encodeURIComponent. Comme j'attends une chaîne encodée, j'ai utilisé HttpUtility.UrlDecode dans mon code Web Api, pour le décoder et l'utiliser dans mon application. Pour vérifier si le code fonctionne comme prévu, j'ai commencé le débogage en envoyant des chaînes codées en entrée. À mon grand étonnement, j'ai trouvé que le paramètre d'entrée décodait déjà par lui-même et le transmettait dans la méthode d'action. Cela a bien fonctionné avec la méthode de décodeur que j'ai utilisée, mais j'ai commencé à casser quand il y avait un caractère "+". quand je passe une chaîne avec le caractère "+" la méthode du décodeur l'a changé en un espace vide.Méthode d'action C# Web Api décodant automatiquement le paramètre de requête

par exemple. passant djdh67-y&+dsdj au décodeur a changé pour djdh67-y& dsdj

Il y avait deux surprises pour moi. Premièrement, pourquoi le paramètre a-t-il été décodé par lui-même et, ensuite, pourquoi le caractère "+" a-t-il été décodé dans un espace vide? Je ne peux pas utiliser ce code jusqu'à ce que je comprenne ce qui se passe parce qu'il pourrait y avoir des surprises plus tard (peut-être que le décodage automatique s'arrête) ce qui ne sera pas bon. Est-ce que quelqu'un peut m'expliquer ce qui se passe exactement ou quelle est la meilleure façon de résoudre ce problème?

Répondre

3

Pour résoudre le problème il suffit de se débarrasser de la partie HttpUtility.UrlDecode(encodedString).

La valeur qui vient à l'action a déjà été décodée et vous n'avez pas besoin de décoder la deuxième fois.

Dans votre exemple:

encodeURIComponent("djdh67-y&+dsdj")  -> djdh67-y%26%2Bdsdj // sent 
HttpUtility.UrlDecode("djdh67-y%26%2Bdsdj") -> djdh67-y&+dsdj  // done 
HttpUtility.UrlDecode("djdh67-y&+dsdj")  -> djdh67-y& dsdj  // wrong 

valeurs non codées dans GET peuvent être mal à interpréter par le navigateur. par exemple. le symbole & dans la chaîne de requête signifie le paramètre suivant. C'est pourquoi MVC "pense" que chaque paramètre get est encodé et le décode.

Si une chaîne est requise à l'état non modifié, elle doit être transmise dans le corps d'une requête POST.

+0

Je sais que le retrait de la méthode de décodage résoudra le problème. Je veux savoir comment la chaîne encodée a été décodée automatiquement. Est-ce à cause de certaines fonctionnalités internes d'asp.net Web Api? Pouvons-nous avoir le contrôle en utilisant la config? Va-t-il décoder la chaîne à 100% à chaque fois? – nak

+0

Je suppose que ce n'est pas possible en utilisant 'GET'. Parce que les paramètres 'GET' devraient être encodés pour être correctement traités par le navigateur. Mais il n'est pas automatiquement encodé/décodé en cas de requête POST. Changez votre requête en 'POST' et placez les données dans ** body ** plutôt que de les décoder. – ASpirin

0

Pour ajouter à la réponse ci-dessus, la question du décodage + caractère à l'espace est de savoir comment fonctionne le décodage d'encodage. Un espace est codé à + et, par conséquent, le décodera dans l'espace.

Vous pouvez voir ce qui suit en action lorsque nous effectuons une recherche google. Si vous tapez une chaîne avec des espaces dans la boîte de recherche google et cliquez sur Rechercher, vérifiez l'URL, il aura un paramètre de requête "q" qui aura les termes de recherche. Ceux-ci seront codés et les espaces dans les termes seront convertis en +