2016-08-07 7 views
0

Ich versuche, eine PostAsync-Anfrage mit C# zu machen. Das Folgende ist mein Code.httpclient Header + Inhalt trat PostAsyn

 static void Main(string[] args) 
    { 

     CookieContainer cookies = new CookieContainer(); 
     HttpClientHandler handler = new HttpClientHandler(); 
     handler.CookieContainer = cookies; 
     using (var client = new HttpClient(handler)) 
     { 
      using (HttpResponseMessage getResponse = client.GetAsync("http://google.com").Result) 
      { 
       CheckStatusCode(getResponse); 
       String header = getResponse.Headers.ToString(); 
       var content = CreateCollection(getResponse.Content); 
       var _stringHeaderContent = header + "\r" + content; 

       HttpContent _content = new StringContent(_stringHeaderContent, Encoding.UTF8); 
       Console.WriteLine(_content); 
       using (HttpResponseMessage postResponse = client.PostAsync("http://google.com",_content).Result) 
       { 
        Console.WriteLine(postResponse.Headers); 
        CheckStatusCode(postResponse); 
        Console.WriteLine(postResponse.Headers); 
       } 
      } 

     } 
    } 

Methoden:

public static void CheckStatusCode(HttpResponseMessage response) 
    { 
     if (response.StatusCode != HttpStatusCode.OK) 
      throw new Exception(String.Format(
      "Server error (HTTP {0}: {1}).", 
      response.StatusCode, 
      response.ReasonPhrase)); 
     else 
      Console.WriteLine("200"); 
    } 
    public static String CreateCollection(HttpContent content) 
    { 
     var myContent = content.ReadAsStringAsync().Result; 
     HtmlNode.ElementsFlags.Remove("form"); 
     string html = myContent; 
     var doc = new HtmlAgilityPack.HtmlDocument(); 
     doc.LoadHtml(html); 
     var input = doc.DocumentNode.SelectSingleNode("//*[@name='__Token']"); 
     var token = input.Attributes["value"].Value; 
     //add all necessary component to collection 
     NameValueCollection collection = new NameValueCollection(); 
     collection.Add("__Token", token); 
     collection.Add("returnURL", ""); 
     collection.Add("Email", "[email protected]"); 
     collection.Add("Password", "1234"); 
     String queryString = GenerateQueryString(collection); 
     return queryString; 
    } 
    public static string GenerateQueryString(NameValueCollection collection) 
    { 
     var array = (from key in collection.AllKeys 
        from value in collection.GetValues(key) 
        select string.Format("{0}={1}", WebUtility.UrlEncode(key), WebUtility.UrlEncode(value))).ToArray(); 
     return string.Join("&", array); 
    } 

Das Problem, das ich mit diesem Code habe nichts in _content gespeichert wird. Ich versuche, eine PostAsync-Anfrage mit dem Header und einem Teil des Inhalts verbunden zu machen. Wenn ich jedoch die postAsync-Anfrage mache, wird nichts in _content gespeichert. Daher schlägt die Anforderung fehl.

Kann mir jemand erklären, wie ich eine postAsync Anfrage mit _stringHeaderContent machen kann?

Grüße

Antwort

0

Dies ist die Art und Weise, wie PostAsync verwenden:

... 
var httpClient = new HttpClient(); 

var postData = new List<KeyValuePair<string, string>>(); 
postData.Add(new KeyValuePair<string, string>("a", "1")); 
postData.Add(new KeyValuePair<string, string>("b", "2")); 
var content = new FormUrlEncodedContent(postData); 

var result = httpClient.PostAsync("http://127.0.0.1/a.php", content).Result; 
... 
+0

wie kann ich Vergangenheit Cookies passieren? – Puzzle

+0

Siehe hierzu: http://stackoverflow.com/questions/12373738/how-do-i-set-a-cookie-on-httpclients-httprequestmessage –