Problem mit multipart/form-data Upload

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Mono.

    Problem mit multipart/form-data Upload

    Hallo Leute,

    ich möchte eine Datei auf uploaded.net hochladen, dazu benutze ich den HttpClient um ein MultipartFormDataContent abzuschicken:
    Spoiler anzeigen

    C#-Quellcode

    1. private static async Task Upload(string url, string file, string boundry)
    2. {
    3. var fi = new FileInfo(file);
    4. var handler = new HttpClientHandler { CookieContainer = _cContainer };
    5. var httpClient = new HttpClient(handler);
    6. httpClient.DefaultRequestHeaders.ConnectionClose = false;
    7. httpClient.DefaultRequestHeaders.ExpectContinue = false;
    8. httpClient.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
    9. httpClient.DefaultRequestHeaders.Add("Accept", "text/*");
    10. httpClient.DefaultRequestHeaders.Add("User-Agent", "Shockwave Flash");
    11. var form = new MultipartFormDataContent();
    12. var fileName = new StreamContent(new MemoryStream(Encoding.ASCII.GetBytes($"{fi.Name}")));
    13. fileName.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
    14. {
    15. Name = "\"Filename\""
    16. };
    17. var fileData = new ByteArrayContent(File.ReadAllBytes(fi.FullName));
    18. fileData.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
    19. {
    20. Name = "\"Filedata\"",
    21. FileName = $"\"{fi.Name}\"",
    22. };
    23. fileData.Headers.ContentType = MediaTypeHeaderValue.Parse(MimeMapping.GetMimeMapping(fi.FullName));
    24. var submitQuery = new StreamContent(new MemoryStream(Encoding.ASCII.GetBytes("Submit Query")));
    25. submitQuery.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
    26. {
    27. Name = "\"Upload\""
    28. };
    29. form.Add(fileName);
    30. form.Add(fileData);
    31. form.Add(submitQuery);
    32. await httpClient.PostAsync(url, form);
    33. }
    34. }


    Den Post Request habe ich mittels Fiddler4 aufgezeichnet und nachgebildet:
    Aufzeichnung

    Brainfuck-Quellcode

    1. POST http://am4-r1f4-stor01.uploaded.net/upload?admincode=futoju&id=16008028&pw=e09f159f4d0ed79753e452386165c6dff966651c HTTP/1.1
    2. Accept: text/*
    3. Content-Type: multipart/form-data; boundary=----------KM7Ij5ei4gL6ae0ae0Ij5Ij5KM7Ij5
    4. User-Agent: Shockwave Flash
    5. Host: am4-r1f4-stor01.uploaded.net
    6. Content-Length: 576
    7. Connection: Keep-Alive
    8. Pragma: no-cache
    9. Cookie: login=%26id%3D16008028%26pw%3De09f159f4d0ed79753e452386165c6dff966651c%26cks%3Dd05efc3e15f9; auth=16008028248096555bf8326361658a0482e4880b
    10. ------------KM7Ij5ei4gL6ae0ae0Ij5Ij5KM7Ij5
    11. Content-Disposition: form-data; name="Filename"
    12. 00050000101c9500.ini
    13. ------------KM7Ij5ei4gL6ae0ae0Ij5Ij5KM7Ij5
    14. Content-Disposition: form-data; name="Filedata"; filename="00050000101c9500.ini"
    15. Content-Type: application/octet-stream
    16. # TLoZ: Breath of the Wild (EUR)
    17. [CPU]
    18. emulateSinglePrecision = true
    19. [Graphics]
    20. GPUBufferCacheAccuracy = 2
    21. disableGPUFence = true
    22. ------------KM7Ij5ei4gL6ae0ae0Ij5Ij5KM7Ij5
    23. Content-Disposition: form-data; name="Upload"
    24. Submit Query
    25. ------------KM7Ij5ei4gL6ae0ae0Ij5Ij5KM7Ij5--




    Mein Request

    Quellcode

    1. POST http://am4-r1f9-stor06.uploaded.net/upload?admincode=dotumu&id=16008028&pw=e09f159f4d0ed79753e452386165c6dff966651c HTTP/1.1
    2. Accept: text/*
    3. User-Agent: Shockwave Flash
    4. Content-Type: multipart/form-data; boundary="2a687053-9856-4868-a4fa-a256a77b5aa4"
    5. Host: am4-r1f9-stor06.uploaded.net
    6. Cookie: login=%26id%3D16008028%26pw%3De09f159f4d0ed79753e452386165c6dff966651c%26cks%3Dd05efc3e15f9; auth=16008028248096555bf8326361658a0482e4880b
    7. Content-Length: 562
    8. --2a687053-9856-4868-a4fa-a256a77b5aa4
    9. Content-Disposition: form-data; name="Filename"
    10. 00050000101c9500.ini
    11. --2a687053-9856-4868-a4fa-a256a77b5aa4
    12. Content-Disposition: form-data; name="Filedata"; filename="00050000101c9500.ini"
    13. Content-Type: application/octet-stream
    14. # TLoZ: Breath of the Wild (EUR)
    15. [CPU]
    16. emulateSinglePrecision = true
    17. [Graphics]
    18. GPUBufferCacheAccuracy = 2
    19. disableGPUFence = true
    20. --2a687053-9856-4868-a4fa-a256a77b5aa4
    21. Content-Disposition: form-data; name="Upload"
    22. Submit Query
    23. --2a687053-9856-4868-a4fa-a256a77b5aa4--




    Mein Problem ist jetzt das ich bei meinem Code keine, bzw. eine leere, Antwort erhalte, erwartet hätte ich etwas wie: 4tva1nb1,0.

    Ich sitzte jetzt seit knapp 6 Stunden an diesem Problem und finde einfach keinen Fehler!
    Woher willst du wissen das du eine keine/eine leere Antwort bekommst?
    Du schickst deinen Request ab ohne den Response zu speichern/verarbeiten.
    Sehe ich in Fiddler (NetworkSniffer) und auch daran das die hochgeladene Datei nicht im Account erscheint!
    Cookies werden beim Login abgeholt, sind vorhanden, is ja auch vorhanden beim Request ;)

    Majomi schrieb:

    Cookie: login=%26id%3D16008028%26pw%3De09f159f4d0ed79753e452386165c6dff966651c%26cks%3Dd05efc3e15f9; auth=16008028248096555bf8326361658a0482e4880b
    Dann schau dir den Response an, evtl. findest du da Informationen was schiefgegangen ist.

    Edit: Und meine Frage bezog sich auf "Mein Problem ist jetzt das ich bei meinem Code keine, bzw. eine leere, Antwort erhalte"
    Ich kann es leider nicht testen. Auf den zweiten Blick schaut alles eigentlich ok aus.
    Wieviele Requests schickst du btw vor dem Post ab?
    Eventuell hat es was mit dem ConnectionLimit vom ServicePoint in net zu tun.
    Damit hatte man beim HTTPRequest öfters Probleme in .NET

    Damit

    C#-Quellcode

    1. System.Net.ServicePointManager.DefaultConnectionLimit= 10;


    kann man es ändern.
    Ich vermute der HTTPClient basiert auch auf der Webrequest Class aus dem Framework.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!