2017-07-19 46 views
0

我正在開發一個C#wpf應用程序,它具有登錄到我的網站並下載文件的功能。這個網站的行爲有一個授權屬性。我需要2個cookie才能下載文件,第一個cookie用於登錄,第二個cookie(成功登錄後提供)用於下載文件。所以我提出了在我的httpwebrequest/httpwebresponse之後保留cookie的流程。我正在查看我的發佈流程,因爲這可能是問題所在。這是我的代碼。C#:HttpWebRequest POST數據不工作

void externalloginanddownload() 
{ 
    string pageSource = string.Empty; 
    CookieContainer cookies = new CookieContainer(); 

    HttpWebRequest getrequest = (HttpWebRequest)WebRequest.Create("login uri"); 
    getrequest.CookieContainer = cookies; 
    getrequest.Method = "GET"; 
    getrequest.AllowAutoRedirect = false; 

    HttpWebResponse getresponse = (HttpWebResponse)getrequest.GetResponse(); 

    using (StreamReader sr = new StreamReader(getresponse.GetResponseStream())) 
    { 
     pageSource = sr.ReadToEnd(); 
    } 

    var values = new NameValueCollection 
    { 
       {"Username", "username"}, 
       {"Password", "password"}, 
     { "Remember me?","False"}, 
      }; 

    var parameters = new StringBuilder(); 

    foreach (string key in values.Keys) 
    { 
     parameters.AppendFormat("{0}={1}&", 
      HttpUtility.UrlEncode(key), 
      HttpUtility.UrlEncode(values[key])); 
    } 

    parameters.Length -= 1; 

    HttpWebRequest postrequest = (HttpWebRequest)WebRequest.Create("login uri"); 
    postrequest.CookieContainer = cookies; 
    postrequest.Method = "POST"; 

    using (var writer = new StreamWriter(postrequest.GetRequestStream())) 
    { 
     writer.Write(parameters.ToString()); 
    } 

    using (WebResponse response = postrequest.GetResponse()) // the error 500 occurs here 
    { 
     using (var streamReader = new StreamReader(response.GetResponseStream())) 
     { 
      string html = streamReader.ReadToEnd(); 

     } 
    } 
} 
+0

你還沒有提到你有什麼問題。它在哪裏失敗? –

+0

它無法通過POST方法獲取httpwebrequest的響應。它給了我一個錯誤500. –

+0

和你爲什麼這樣做?:parameters.Length - = 1; –

回答

1

當你得到WebResponse的,返回的餅乾將在響應,而不是在請求(奇怪的是,即使你需要的CookieContainer的要求)。

您需要將響應對象中的Cookie添加到CookieContainer中,以便在下一個請求中發送。

一個簡單的方法:

for(var cookie in getresponse.Cookies) 
    cookies.Add(cookie) 

由於響應餅乾已經是餅乾的容器,你可以這樣做(可能有助於檢查空的情況下,所有的cookies已經在那裏)

if (response.Cookies != null) cookies.Add(response.Cookies) 

您也可能會遇到麻煩你的文章,你需要設置的ContentType和長度:

myWebRequest.ContentLength = parameters.Length; 
myWebRequest.AllowWriteStreamBuffering = true; 

如果您有任何多字節字符需要考慮,那麼您可能必須通過在請求和stringbuilder上將編碼設置爲UTF-8並將字符串轉換爲字節並使用該長度來解決該問題。

另一個提示:如果沒有用戶代理,一些Web服務器代碼會窒息。嘗試:

myWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"; 

以防萬一您有任何多字節字符,這是更好地做到這一點:

var databytes = System.Text.Encoding.UTF8.GetBytes(parameters.ToString()); 
myWebRequest.ContentLength = databytes.Length; 
myWebRequest.ContentType = "application/x-www-form-urlencoded; charset=utf-8"; 
using (var stream = myWebRequest.GetRequestStream()) 
{ 
    stream.Write(databytes, 0, databytes.Length); 
} 
+0

響應*應該*只包括不在請求中的新cookie,所以在每次請求後都應該完成你想要的內容 –

+0

我不確定「application/x-www-form-urlencoded」是否意味着我傳遞給操作的值放在URL上? –

+0

「application/x-www-form-urlencoded」基本上意味着post參數被格式化爲「key = value&key = value ...」,而不是json編碼或其他類型。 –

0

在C#應用程序(服務器端Web API)啓用C++異常和公共語言運行使用(Ctrl + Alt + E)實時異常什麼是服務器端拋出異常。

首先你檢查數據是否綁定正確。在你看到它是精確異常之後。內部服務器錯誤大多數情況下拋出的數據格式不正確,沒有正確管理異常。