2017-06-10 2 views
0

Ich versuche, ein C# -Skript zu schreiben, das in der Tat dasselbe tut, als wenn ich ein Formular über die Benutzeroberfläche einer bestimmten Webseite absende. Dies ist auf einer öffentlichen Seite einer Website, die keine Cookies verwendet. Ich schaute auf die Registerkarte Netzwerk in Chrome für das, was passiert in der Anfrage/Antwort, wenn ich einen Kommentar enter image description hereEmulation einer Webseite Formular POST-Übermittlung durch C#

enter image description here

einreichen und ich versuche, dass in C# Land zu emulieren:

    CommentFormData data = CommentFormData.GenerateRandom(); 
        string json = new JavaScriptSerializer().Serialize(data); 
        StringContent content = new StringContent(json, Encoding.UTF8); 
        content.Headers.TryAddWithoutValidation("Accept", "text/javascript, text/html, application/xml, text/xml, */*"); 
        content.Headers.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate, br"); 
        content.Headers.TryAddWithoutValidation("Accept-Language", "en-US,en;q=0.8"); 
        content.Headers.TryAddWithoutValidation("Connection", ";eep-alive"); 
        content.Headers.TryAddWithoutValidation("Content-Length", json.Length.ToString()); 
        content.Headers.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 
        content.Headers.TryAddWithoutValidation("Host", "..."); 
        content.Headers.TryAddWithoutValidation("Origin", "..."); 
        content.Headers.TryAddWithoutValidation("Referer", "...); 
        content.Headers.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"); 
        content.Headers.TryAddWithoutValidation("X-Prototype-Version", "1.6.1"); 
        content.Headers.TryAddWithoutValidation("X-Requested-With", "XMLHttpRequest"); 
        HttpResponseMessage response = await client.PostAsync("...", content); 

.....

internal class CommentFormData 
{ 
    public string pageID { get; } = "..."; 
    public string comment { get; set; } 
    public string author { get; set; } 
    public string email { get; set; } 
    public int timezone { get; } = -7; 

    public static CommentFormData GenerateRandom() 
    { 
     return new CommentFormData() 
     { 
      comment = GenerateRandomString(), 
      author = GenerateRandomString(), 
      email = $"{GenerateRandomString()}@gmail.com" 
     }; 
    } 

    private static string GenerateRandomString(int length = 100) 
    { 
     Random random = new Random(); 
     return new string(Enumerable.Repeat("ABCDEFGHIJKLMNOPQRSTUVWXYZ", length) 
      .Select(s => s[random.Next(s.Length)]).ToArray()); 
    } 
} 

ich erhalte Statuscode 200 zurück, aber es ist nicht die gleiche Arbeit. Die Antwort, die ich bekomme, ist

StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: 
{ 
    Transfer-Encoding: chunked 
    Connection: keep-alive 
    Keep-Alive: timeout=20 
    Vary: Accept-Encoding 
    Date: Sat, 10 Jun 2017 20:44:36 GMT 
    Server: nginx 
    Content-Type: text/xml; charset=utf-8 
} 

also warum funktioniert das nicht? Irgendwelche Ideen?

+1

Sie scheinen JSON-Codierung für Ihre Daten statt Formularcodierung, gibt es einen Grund dafür? –

+0

Entspricht Ihr Serialisierungstyp für den Anforderungsinhalt dem Content-Type-Header? – Jasen

+0

@NickBailey Nein, und das ist wahrscheinlich mein Problem. Lass mich sehen ob das das beheben wird ... – user7127000

Antwort