Wie kann ich verhindern, dass ReadAsStringAsync Rückkehr eine doppelt escaped string?
Ich habe eine Web-API-Methode, die ein bisschen aussieht wie diese:
[HttpPost]
public ResponseMessageResult Post(Thing thing)
{
var content = "\r";
var httpResponseMessage = Request.CreateResponse(HttpStatusCode.Accepted, content);
return ResponseMessage(httpResponseMessage);
}
In einigen anderen client-code, wenn ich rufe:
var content = httpResponseMessage.Content.ReadAsStringAsync().Result;
content
ist:
"\\r"
aber ich möchte es zu bleiben, wie das original:
"\r"
warum ist der client empfängt ein doppelt escaped string und wie kann ich es verhindern?
Der zurückgegebene string ist
JSON-würde es brauchen
P, Nein, ich bin empfangen von verbatim '@"\\r"'
der text-box angezeigt \r (wörtlich), es ist nicht zweideutig, habe ich den Wert @"\r", erhalten den Wert @"\\r", brauchen aber den Wert @"\r" in meinem client-code wie bereits in der Frage.
Ich Verweise wieder auf meinen ersten Kommentar.
"\\r"
weil @"\r"
entspricht "\\r"
. Wenn Sie möchten, übergeben Sie die return-Zeichen anstelle von Escape-version, entfernen die verbatim-modifier.JSON-würde es brauchen
\\r
in einen string, wenn Sie wollen `.P, Nein, ich bin empfangen von verbatim '@"\\r"'
der text-box angezeigt \r (wörtlich), es ist nicht zweideutig, habe ich den Wert @"\r", erhalten den Wert @"\\r", brauchen aber den Wert @"\r" in meinem client-code wie bereits in der Frage.
Ich Verweise wieder auf meinen ersten Kommentar.
\r
in einem Textfeld die Zeichenfolge "\\r"
die gleich @"\r"
. Entfernen Sie die wörtliche Charakter.InformationsquelleAutor Grokodile | 2013-11-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es tut, was es tun, weil Sie sind Rissbildung ein ei mit einem Vorschlaghammer.
Beim Aufruf
Request.CreateResponse<string>(HttpStatusCode statusCode, T value)
Sie sagen, web-API, die Sie möchten, dass Ihr Wert serialisiert mit einer von den Medien-Typ formatter. So Web API stopft Ihrevalue
in eine Instanz von ObjectContent hat eine ganze Reihe von conneg-code, und legt fest, dass Sie verwenden können, Formatter X serialisieren, die Ihr "Objekt".Chancen sind es ist der JSONSerializer, die Ihr bestes tut, um zu versuchen, eine Rückkehr Sie die Zeichenfolge denkt, dass es Sie wollen, anstatt dem CR-Zeichen.
Trotzdem können Sie auf den Punkt und vermeiden Sie die Ausführung 70 bajillion Zeilen code mit dem HttpContent-Objekt, das ausgelegt ist zum senden von einfachen strings über den Draht.
Liebte dieses.. verschwendet rund 3 Stunden zu finden, den Charme 🙂
[plus]1 für 70 bajillion Zeilen code
InformationsquelleAutor Darrel Miller
Ich weiß, dass ich wahrscheinlich zu verursachen 70 bajillion Zeilen code ausführen, indem Sie dies zu tun (sorry, Darrel Miller), aber ich fand, es war genauso wirksam, und weniger störend zu meinem gewählten Entwicklung Muster zu verwenden:
oder
statt dieser (Austritt der Anführungszeichen):
Hinweis: die
ReadAsAsync
ist eine Erweiterung Methode in derSystem.Net.Http.HttpContentExtensions
imSystem.Net.Http.Formatting
Montage. Wenn es nicht in Ihrem Projekt verwenden, können Sie die NuGet-PaketMicrosoft.AspNet.WebApi.Client
.Ich habe aktualisiert die Antwort auf Ihre Informationen. In einigen Projekten (z.B. Xamarin) es ist nicht standardmäßig verfügbar.
var jobj = warten auf Antwort.Inhalt.ReadAsAsync<Newtonsoft.Json.Linq -.JObject>(); arbeitete für mich
Wenn Sie keinen Zugriff auf den server-code (also mit diesem problem konfrontiert, während der Konsum einer 3rd-party-webservice), dann fixieren Sie es auf der client-Seite dieser Art ist die beste option
InformationsquelleAutor Josh
Du nicht empfangen den Wert
@"\\r"
zurück, Sie erhalten"\\r"
- werden Sie nicht bekommen eine wörtliche Charakter in Ihrer Antwort, da eine wörtliche Charakter ist nur eine Anweisung für die Flucht ein string eine bestimmte Art und Weise - die verbatim modifier selbst nicht gespeichert, als Teil der Zeichenfolge. Das Ergebnis ist dem entsprechend escaped version von dem, was du die verbatim-Modifizierer.d.h.
@"\r"
gibt Sie den string"\\r"
welche, wenn angewendet auf eine text-box, die zeigt, wie\r
- ein entflohener backslash und ein 'r'.Brauchen Sie nur zu ergreifen, die verbatim-Modifizierer aus Ihrer anfänglichen Zuweisung.
Dies hat nichts zu tun mit
ReadAsStringAsync
- du bist einfach die Zuordnung der falsche string-literal in den ersten Platz.InformationsquelleAutor Ant P
Wenn Sie sind immer eine wörtliche zwei-Zeichen -
\r
Sequenz aus ("\\r"
im C# - Formular), dann ist fast mit Sicherheit das, was Sie setzen in. Sie sagen, Ihr Web-API-Methode "sieht ein bisschen aus wie diese". Ich vermute stark, das problem liegt in dem Unterschied zwischen dem, was du gepostet hast, in deiner Frage, und was ist Ihre tatsächliche Umsetzung.Müssen Sie überprüfen, dass Ihre response-Nachricht enthält die tatsächlichen Zeilenumbrüche und nicht der wörtliche text
"\r"
. Ein text-lese-API ist nicht wörtlich zu C# escape-Sequenzen und behandeln Sie speziell, weil C# string-escape-Sequenzen haben keine Bedeutung im Klartext. Wenn Ihr text-Datei enthielt den textc:\name.txt
, dann würden Sie nicht erwarten, dass ein text-lese-API Lesen Sie, wiec:<NEWLINE>ame.txt
.Wenn Sie möchten, zu finden und zu konvertieren C#-Stil escape-Sequenzen, Sie haben es selbst zu tun. Sie können eine Methode wie diese (zusätzliche escape-Sequenzen wie nötig):
InformationsquelleAutor Mike Strobel
InformationsquelleAutor user2397863