Comment puis-je empêcher ReadAsStringAsync de renvoyer une chaîne à double échappement?
J'ai une Web API méthode qui ressemble un peu à ceci:
[HttpPost]
public ResponseMessageResult Post(Thing thing)
{
var content = "\r";
var httpResponseMessage = Request.CreateResponse(HttpStatusCode.Accepted, content);
return ResponseMessage(httpResponseMessage);
}
Dans certains autres code client, quand je l'appelle:
var content = httpResponseMessage.Content.ReadAsStringAsync().Result;
content
est:
"\\r"
mais j'aimerais que ça reste comme l'original:
"\r"
pourquoi le client de la réception d'un doublement échappé à la chaîne et comment puis-je l'éviter?
source d'informationauteur Grokodile
Vous devez vous connecter pour publier un commentaire.
Il est en train de faire ce qu'il fait parce que vous êtes casse un œuf avec un marteau de forgeron.
Lorsque vous appelez
Request.CreateResponse<string>(HttpStatusCode statusCode, T value)
vous dites API web que vous aimeriez que votre valeur sérialisée en utilisant un type de média formateurs. Si le Web API fourre votrevalue
dans une instance de ObjectContent ne toute une série de conneg code, et détermine qu'il peut utiliser Formateur X pour sérialiser votre "objet".Les Chances sont que c'est la JSONSerializer qui fait de son mieux pour essayer de vous retourner la chaîne, il pense que vous voulez plutôt que le caractère CR.
De toute façon, vous pouvez couper à la chasse et à éviter l'exécution de 70 bajillion lignes de code à l'aide de la HttpContent objet qui est conçu pour l'envoi de simples chaînes sur le câble.
Je sais que je vais probablement à l'origine de 70 bajillion lignes de code à exécuter en faisant cela (désolé Darrel Miller) mais j'ai trouvé que c'était tout aussi efficace, et moins de perturbations pour mon modèle de développement choisi d'utiliser cette:
ou
au lieu de cela (qui s'échappe de la cite):
Remarque: le
ReadAsAsync
est une méthode d'extension dans leSystem.Net.Http.HttpContentExtensions
dans leSystem.Net.Http.Formatting
de l'assemblée. Si il n'est pas disponible dans votre projet, vous pouvez ajouter le package NuGetMicrosoft.AspNet.WebApi.Client
.Vous ne recevez pas la valeur
@"\\r"
de retour, vous recevez"\\r"
- vous n'aurez pas un mot à mot les caractères de votre réponse, car un procès personnage est juste une instruction pour échapper à une chaîne de particulier - le verbatim modificateur lui-même n'est pas stockée en tant que partie de la chaîne. Le résultat est bien échappé à la version que vous avez appliqué le verbatim modificateur.c'est à dire
@"\r"
vous donne la chaîne"\\r"
qui, lorsqu'il est appliqué à une zone de texte s'affiche comme\r
- la séquence d'échappement barre oblique inverse et un "r".Vous avez juste besoin de prendre le verbatim modificateur hors de votre affectation initiale.
Cela n'a rien à voir avec
ReadAsStringAsync
- vous êtes juste en attribuant le mal littéral de chaîne dans la première place.Si vous obtenez un littéral de deux caractères
\r
séquence ("\\r"
en C#), puis qui est presque certainement ce que vous mettez dans. Vous dire que votre site Web API méthode "ressemble un peu à ça". Je soupçonne fortement que le problème réside dans la différence entre ce que vous avez publié dans votre question, et ce qui est dans votre mise en œuvre effective.Vous devez vérifier que votre message de réponse contenant les retours chariot et non pas du sens littéral du texte
"\r"
. Un texte de lecture de l'API n'est pas d'aller le chercher littérale C# séquences d'échappement et de les gérer spécialement parce que le C# string séquences d'échappement n'ont aucune signification en texte brut. Si votre fichier texte contient le textec:\name.txt
alors vous ne vous attendez pas à une lecture du texte de l'API pour lire commec:<NEWLINE>ame.txt
.Si vous voulez trouver et de les convertir en C#style des séquences d'échappement, vous devrez le faire vous-même. Vous pouvez utiliser une méthode comme ceci (en ajouter d'autres séquences d'échappement que nécessaire):