Ich habe einen REST-Dienst, der eine Datei liest und an eine andere Konsolenanwendung sendet, nachdem sie in ein Byte-Array und dann in eine Base64-Zeichenfolge konvertiert wurde. Dieser Teil funktioniert, aber wenn derselbe Stream in der Anwendung empfangen wird, wird er manipuliert und ist keine gültige Base64-Zeichenfolge mehr. Einige Junk-Charaktere werden in den Stream eingeführt.
Die Ausnahme, die beim Konvertieren des Streams zurück in Byte empfangen wird, ist
Die Eingabe ist keine gültige Base-64-Zeichenfolge, da sie ein Nicht-Base-64-Zeichen, mehr als zwei Füllzeichen oder ein nicht Leerzeichen unter den Füllzeichen enthält
Im Service:
[WebGet(UriTemplate = "ReadFile/Convert", ResponseFormat = WebMessageFormat.Json)]
public string ExportToExcel()
{
string filetoexport = "D:\\SomeFile.xls";
byte[] data = File.ReadAllBytes(filetoexport);
var s = Convert.ToBase64String(data);
return s;
}
Bei der Anwendung:
var client = new RestClient("http://localhost:56877/User/");
var request = new RestRequest("ReadFile/Convert", RestSharp.Method.GET);
request.AddHeader("Accept", "application/Json");
request.AddHeader("Content-Type", "application/Json");
request.OnBeforeDeserialization = resp => {resp.ContentType = "application/Json";};
var result = client.Execute(request);
byte[] d = Convert.FromBase64String(result.Content);
Encoding
.s
im Dienst), und den Inhalt, der empfangen wird (dhresult.content
Sie müssen nicht die gesamte Zeichenfolge veröffentlichen, sondern nur bis zum ersten verstümmelten Zeichen (oder, wenn das noch zu lang ist) , einige Teilzeichenfolgen, die zeigen, was gesendet und was empfangen wurde)result.Content
? Hier erfahren Sie, ob das Problem beim Server oder beim Client liegt.Antworten:
Überprüfen Sie, ob Ihre Bilddaten zu Beginn einige Header-Informationen enthalten:
Dies führt zu dem oben genannten Fehler.
Entfernen Sie einfach alles vor und einschließlich des ersten Kommas, und schon kann es losgehen.
quelle
,
wenndata:
vorhanden ist. Bam. Arbeite jetzt.str.Substring(str.LastIndexOf(',') + 1)
Sollte es tun.Sehr wahrscheinlich wird es zu einem modifizierten Base64 umgewandelt zu werden , wo die
+
und/
Zeichen geändert werden-
und_
. Siehe http://en.wikipedia.org/wiki/Base64#Implementations_and_historyWenn dies der Fall ist, müssen Sie es zurück ändern:
quelle
Wir können unnötige Zeichenfolgeneingaben vor dem Wert entfernen.
quelle
Nur für den Fall, dass Sie den Typ des hochgeladenen Bildes nicht kennen und nur dessen
base64
Kopfzeile entfernen müssen :quelle
Da Sie eine Zeichenfolge als JSON zurückgeben, enthält diese Zeichenfolge die öffnenden und schließenden Anführungszeichen in der Rohantwort. Ihre Antwort sollte also wahrscheinlich so aussehen:
oder was auch immer ... Sie können versuchen, dies mit Fiddler zu bestätigen.
Ich vermute, dass dies die Rohzeichenfolge ist
result.Content
, einschließlich der Anführungszeichen. Wenn dies der Fall ist,result.Content
muss es deserialisiert werden, bevor Sie es verwenden können.quelle
Ich habe einen ähnlichen Kontext wie Sie beschrieben und den gleichen Fehler festgestellt. Ich schaffte es zum Laufen zu bringen , indem die Entfernung
"
von dem Anfang und das Ende des Inhalts und durch den Ersatz\/
mit/
.Hier ist das Code-Snippet:
Alternativ können Sie XML für das Antwortformat verwenden:
Auf der Client-Seite:
quelle
quelle
Wie Alex Filipovici erwähnte, war das Problem eine falsche Codierung. Die Datei, die ich eingelesen habe, war
UTF-8-BOM
und warf den obigen Fehler aufConvert.FromBase64String()
. Der Wechsel zuUTF-8
hat ohne Probleme funktioniert.quelle
Und manchmal begann es mit doppelten Anführungszeichen, meistens, wenn Sie die API von dotNetCore 2 aus aufrufen, um eine Datei abzurufen
quelle