Laden...

Daten an PHP Skript schicken per HttpClient Klasse

Erstellt von iSteffen vor einem Jahr Letzter Beitrag vor einem Jahr 713 Views
I
iSteffen Themenstarter:in
16 Beiträge seit 2022
vor einem Jahr
Daten an PHP Skript schicken per HttpClient Klasse

Hallo Forum,

da Microsoft empfiehlt die Webclient Klasse nicht mehr zu verwenden bin ich auf der Suche nach Alternativen Lösungen.

Aktuell sende ich per WebClient meine Infos per POST an mein PHP Skript. Ich würde das gerne mit der HTTPClient Klasse Lösen da Microsoft das empfielt.

Wie bekomme ich das den am besten hin?

Mein PHP Script erwartet folgende Daten:

"phpSubject" = textBox1.Text,
"phpBody" = richTextBox2.Text.Replace("\n", "<br>");
"phpSendMail" = "phpSendMail"

Ich erhoffe mir dann auch das der Upload schneller läuft. Mit WebClient kann ich das zwar alles in einen Task schreiben, schneller ist es dadurch aber nicht.

Hier mein aktueller Code falls es jemand interessiert:


 private void button1_Click(object sender, EventArgs e)
        {
            string URL = "https://URL/test/index.php";
            WebClient wc = new WebClient();

                formData["phpSubject"] = textBox1.Text;
                formData["phpBody"] = richTextBox2.Text.Replace("\n", "<br>");
                formData["phpSendMail"] = "phpSendMail";

                byte[] responseBytes = wc.UploadValues(URL, "POST", formData);
                string responsefromserver = Encoding.UTF8.GetString(responseBytes);
                wc.Dispose();
            }


        }   

Gruß
iSteffen

16.807 Beiträge seit 2008
vor einem Jahr

Der HttpClient geht effizienter mit den Systemresourcen um, dazu gibts auch eine sehr ausführliche Dokumentation.
HttpClient Class (System.Net.Http)

Mit Geschwindigkeit hat das nichts zutun.
Software kann Deine Bandbreite nicht erhöhen. Ist kein Zauberer.

I
iSteffen Themenstarter:in
16 Beiträge seit 2022
vor einem Jahr

Ok, danke für die Anwort!

Also kann ich eigentlich bei WebClient bleiben?

Falls ja wie kann ich das am besten in ein eigenen Task schreiben? Er führt es bei mir einfach nicht aus.

16.807 Beiträge seit 2008
vor einem Jahr

Hast doch selbst schon bemerkt, dass man WebClient nicht verwenden soll - warum dann jetz doch auf die Idee kommen, veraltete Komponenten zu nutzen?

Falls ja wie kann ich das am besten in ein eigenen Task schreiben? Er führt es bei mir einfach nicht aus.

HttpClient nehmen, wie er empfohlen ist.
Hat auch asynchrone Unterstützung, was der WebClient nicht hat.

Code Beispiele dazu in den Docs, den Link darf man dann ruhig durchlesen - nicht aus Langeweile gegeben 🙂

I
iSteffen Themenstarter:in
16 Beiträge seit 2022
vor einem Jahr

Ich habe mir jetzt was zusammen gebastelt, bekomme aber immer folgenden Fehler: > Fehlermeldung:

System.InvalidOperationException: "Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet."

Hier mein Code


        private async void Btn_senden_Click(object sender, RoutedEventArgs e)
        {
            // Mail wird verschickt mit allen Informationen
            await Task.Run(() => process1());
        }

 public async Task process1()
        {

            string TicketBetreff = "#" + Tb_KdNr.Text + " " + Tb_KdName.Text + " - " + Tb_Betreff.Text;

            var values = new Dictionary<string, string>
                {
                    { "phpSubject", TicketBetreff},
                    { "phpBody", [b]Tb_Inhalt.Text [/b]},
                    { "phpSendMail", "phpSendMail" }
                };

            var content = new FormUrlEncodedContent(values);

            var response = await client.PostAsync("https://URL/test/index.php", content);

            var responseString = await response.Content.ReadAsStringAsync();

        }

Ich habe mir auch das hier im Forum durchgelsen. Verstehe es aber nicht 🙁

[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

Kann mir hier jemand helfen?

16.807 Beiträge seit 2008
vor einem Jahr

Das Problem ist, dass Du blind im Dunklen rumstocherst und Dich dann wunderst, dass es nicht funktioniert. Was erwartest denn da?
Am Ende wirst schneller und mit mehr Freude an Deine Ziele kommen, wenn Du das Zeug lernst und Erfolge hast.

Dein Task.Run ist hier völlig falsch, völlig unnötig.
Dadurch erzeugst Du künstlich einen neuen Task, der einen anderen Sync Context hat und dadurch eine Threadverletzung erfolgt.

Lösung 1: Lass das Task.Run weg und wende hier einfach async/await korrekt an und führ die Methode direkt aus.
Task.Run ist in der Anwendung hier einfach quatsch.

Lösung 2: Behalte das Task.Run bei und sorg selbst für die Thread Synchronisation.
Beispiel steht dazu in [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) den link kennst ja, musst nur machen, was drin steht.

Auch die Docs zeigen die Anwendung von InvokeRequired in den entsprechenden Docs.
Make thread-safe calls to controls - Windows Forms .NET Framework