1. 程式人生 > >C# POST訪問需要HTTP Digest Authentication認證資源的實現

C# POST訪問需要HTTP Digest Authentication認證資源的實現

在你訪問一個需要HTTP Digest Authentication的URL的時候,如果你沒有提供使用者名稱和密碼,伺服器就會返回401,如果你直接在瀏覽器中開啟,瀏覽器會提示你輸入使用者名稱和密碼;要在傳送請求的時候新增HTTP Digest Authentication認證資訊到請求中,有兩種方法:

  • 一是在請求頭中新增Authorization:
    Authorization: "Digest 使用者名稱和密碼的base64加密字串"
  • 二是在url中新增使用者名稱和密碼:
    http://userName:password@XXX

除去最常用的GET,當使用需要賬戶密碼訪問的站點功能時(比如以http形式訪問的簡訊閘道器)常常需要POST相應資訊(無論它的訊息格式是什麼),下面是封裝好的一個方法:

  1. public int PostRequest(string Url, string user, string pwd, string paramData, Encoding MsgEncode)
  2. {
  3. if (string.IsNullOrEmpty(Url))
  4. {
  5. throw new ArgumentNullException("Url");
  6. }
  7. if (MsgEncode == null)
  8. {
  9. throw new ArgumentNullException("MsgEncoding");
  10. }
  11. string username = user;
  12. string password = pwd;
  13. string usernamePassword = username + ":"
     + password;
  14. CredentialCache mycache = new CredentialCache();
  15. mycache.Add(new Uri(Url), "Digest"new NetworkCredential(username, password));
  16. Logger.INFO(GetType().ToString(), "PostRequest""POST HTTP請求,建立簡訊請求"string.Empty);
  17. HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(new Uri(Url));
  18. Request.Credentials = mycache;
  19. Request.Headers.Add("Authorization""Digest" + Convert.ToBase64String(MsgEncode.GetBytes(usernamePassword)));
  20. Request.Method = "POST";
  21. //Request.Timeout = 1000;
  22. Request.ContentType = "application/x-www-form-urlencoded";
  23. string temp_paramData = "json = " + System.Web.HttpUtility.UrlEncode(paramData);
  24. byte[] byteArray = MsgEncode.GetBytes(temp_paramData);
  25. Request.ContentLength = byteArray.Length;
  26. Stream newStream = Request.GetRequestStream();
  27. newStream.Write(byteArray, 0, byteArray.Length);
  28. newStream.Close();
  29. //string ret = string.Empty;
  30. Logger.INFO(GetType().ToString(), "PostRequest""POST HTTP請求,獲取簡訊HTTP請求響應",string.Empty);
  31. HttpWebResponse response;
  32. try
  33. {
  34. response = (HttpWebResponse)Request.GetResponse();
  35. }
  36. catch (WebException ex)
  37. {
  38. response = (HttpWebResponse)ex.Response;
  39. }
  40. int ret = 0;
  41. ret = (int)response.StatusCode;
  42. Logger.INFO(GetType().ToString(), "PostRequest""POST HTTP請求,傳送簡訊請求返回狀態碼", ret.ToString() + ParaHttpResult(ret));
  43. Stream stream = response.GetResponseStream();
  44. byte[] rsByte = new Byte[response.ContentLength];
  45. //StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default);
  46. //ret = sr.ReadToEnd();
  47. try
  48. {
  49. stream.Read(rsByte, 0, (int)response.ContentLength);
  50. Logger.INFO(GetType().ToString(), "PostRequest""POST HTTP請求,傳送簡訊請求返回內容", System.Text.Encoding.UTF8.GetString(rsByte, 0, rsByte.Length).ToString());
  51. }
  52. catch (Exception ex)
  53. {
  54. Logger.ERROR(GetType().ToString(), "PostRequest""POST HTTP請求,傳送簡訊請求返回內容異常", ex.ToString());
  55. }
  56. stream.Close();
  57. response.Close();
  58. return ret;
  59. }


第一個引數是接受http訪問的url,第二第三引數分別是使用者名稱密碼,第四個引數是訊息內容,第五個引數是訊息內容的編碼格式,關於認證的三種方式和C#相應的類可以查閱基於C#的http協議開發,該方法採用的是Digest摘要認證形式,而且訊息體格式為json;關於http請求訊息的寫入和http響應的獲取可以檢視該方法的實現與MSDN結合看,這樣會有一個比較全面的認識。

最後該方法的返回引數為http響應的狀態碼即200、401等,response.StatusCode是一個列舉,如果不進行轉換獲得的是 OK、NotFound 這樣的名稱。