Hallo
Ich habe folgende Frage:
Ich möchte daten (Text) mittels JSON von meinem Client an einen Server Übertragen (funktioniert auch). Die Daten werden vor dem Versenden in ein Json Formatiert (funktioniert auch)
{"TEST":"datan"}
Der server empängt die anfrage und sendet diese jedoch ohne anführungszeichen zurück. Im meinem Fall wird der ankommende string einfach wieder nur zurückgeschickt.
Woran kann das liegen? Ich nutze C# und System.Text.Json.
Danke im vorraus
Es wäre gut, wenn du etwas (gekürzten) Code und Beispiele für das JSON zeigen könntest.
Hallo Loofsy,
System.Text.Json
Wie nutzt du das? Direkt od. indirekt via ASP.NET Core WebAPI*, etc.?
In den Serialisierungs-Optionen (Blick in die Doku) kann das Verhalten von Anführungszeichen eingestellt werden.
* statt Client/Server selbst zu erstellen ist es fast immer vorzuziehen ein dafür entwickeltes Framework zu verwenden um sich auf den Anwendungscode statt auf die Infrastruktur konzentrieren zu können
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Hallo,
durch ein logging habe ich herrausgefunden, dass die daten zwar richtig an den server rausgehen jedoch der server die anführungszeichen entfernt.
der Folgende code ist der empfangsteil
public static void ReadCallback(IAsyncResult ar)
{
_serverOperate = new Process();
String content = String.Empty;
// Retrieve the state object and the handler socket
// from the asynchronous state object.
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
// Read data from the client socket.
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0)
{
// There might be more data, so store the data received so far.
state.sb.Append(Encoding.ASCII.GetString(
state.buffer, 0, bytesRead));
// Check for end-of-file tag. If it is not there, read
// more data.
content = state.sb.ToString();
if (content.IndexOf("<EOF>") > -1)
{
// All the data has been read from the
// client. Display it on the console.
//Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
// content.Length, content);
// Echo the data back to the client.
try
{
_serverOperate.StartInfo.FileName = _operationAppPath;
_serverOperate.StartInfo.Arguments = "" + DBHost + ";" + DBName + ";" + DBUserName + ";" + DBUserPassword + ";" + content;
_serverOperate.StartInfo.UseShellExecute = false;
_serverOperate.StartInfo.RedirectStandardOutput = true;
_serverOperate.Start();
StreamReader reader = _serverOperate.StandardOutput;
string output = reader.ReadToEnd();
Application.Base.SysLogger.WriteLog(output, @"H:\Test.txt"); //Speichert den empfangenen json in eine textdatei
Send(handler, output);
}
catch(Exception err)
{
Send(handler, err.Message);
}
}
else
{
// Not all data received. Get more.
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
}
Also in dem Code wird nichts entfernt.
Da du auch mit einem Socket arbeitest und die Daten dort direkt ausliest, kannst du auch selbst sehen, dass dort nichts entfernt wird.
Hast du den Code mal debuggt um sicherzustellen, dass im Server die Daten auch richtig ankommen?
Ansonsten fehlt der Code zum senden.
Ebenfalls solltest du für asynchrone Verarbeitung am besten async/await verwenden.
Socket bietet die entsprechenden Async Methoden und in der Doku ist auch alles gut dokumentiert.
Nachtrag:
In deinem else Block macht es keinen Sinn erneut BeginReceive aufzurufen.
Hier läuft deine Verarbeitung bereits asynchron.
Damit schiebst du eine weitere asynchrone Verarbeitung an, was unnötig ist und auch einen neuen Thread benötigt.
Anbei zeig auch den Versand Code sowie den Teil wo du das Objekt serialisiert.
Ggf. ist dort noch was falsch!
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.