在你訪問一個需要HTTP Digest Authentication的URL的時候,如果你沒有提供用戶名和密碼,服務器就會返回401,如果你直接在瀏覽器中打開,瀏覽器會提示你輸入用戶名和密碼;要在發送請求的時候添加HTTP Digest Authentication認證信息到請求中,有兩種方法:
- 一是在請求頭中添加Authorization: Authorization: "Digest 用戶名和密碼的base64加密字符串"
- 二是在url中添加用戶名和密碼: http://userName:password@XXX
除去最常用的GET,當使用需要賬戶密碼訪問的站點功能時(比如以http形式訪問的短信網關)常常需要POST相應信息(無論它的消息格式是什么),下面是封裝好的一個方法:
public int PostRequest(string Url, string user, string pwd, string paramData, Encoding MsgEncode) { if (string.IsNullOrEmpty(Url)) { throw new ArgumentNullException("Url"); } if (MsgEncode == null) { throw new ArgumentNullException("MsgEncoding"); } string username = user; string password = pwd; string usernamePassword = username + ":" + password; CredentialCache mycache = new CredentialCache(); mycache.Add(new Uri(Url), "Digest", new NetworkCredential(username, password)); Logger.INFO(GetType().ToString(), "PostRequest", "POST HTTP請求,創建短信請求", string.Empty); HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(new Uri(Url)); Request.Credentials = mycache; Request.Headers.Add("Authorization", "Digest" + Convert.ToBase64String(MsgEncode.GetBytes(usernamePassword))); Request.Method = "POST"; //Request.Timeout = 1000; Request.ContentType = "application/x-www-form-urlencoded"; string temp_paramData = "json = " + System.Web.HttpUtility.UrlEncode(paramData); byte[] byteArray = MsgEncode.GetBytes(temp_paramData); Request.ContentLength = byteArray.Length; Stream newStream = Request.GetRequestStream(); newStream.Write(byteArray, 0, byteArray.Length); newStream.Close(); //string ret = string.Empty; Logger.INFO(GetType().ToString(), "PostRequest", "POST HTTP請求,獲取短信HTTP請求響應", string.Empty); HttpWebResponse response; try { response = (HttpWebResponse)Request.GetResponse(); } catch (WebException ex) { response = (HttpWebResponse)ex.Response; } int ret = 0; ret = (int)response.StatusCode; Logger.INFO(GetType().ToString(), "PostRequest", "POST HTTP請求,發送短信請求返回狀態碼", ret.ToString() + ParaHttpResult(ret)); Stream stream = response.GetResponseStream(); byte[] rsByte = new Byte[response.ContentLength]; //StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default); //ret = sr.ReadToEnd(); try { stream.Read(rsByte, 0, (int)response.ContentLength); Logger.INFO(GetType().ToString(), "PostRequest", "POST HTTP請求,發送短信請求返回內容", System.Text.Encoding.UTF8.GetString(rsByte, 0, rsByte.Length).ToString()); } catch (Exception ex) { Logger.ERROR(GetType().ToString(), "PostRequest", "POST HTTP請求,發送短信請求返回內容異常", ex.ToString()); } stream.Close(); response.Close(); return ret; }
第一個參數是接受http訪問的url,第二第三參數分別是用戶名密碼,第四個參數是消息內容,第五個參數是消息內容的編碼格式,關於認證的三種方式和C#相應的類可以查閱基於C#的http協議開發,該方法采用的是Digest摘要認證形式,而且消息體格式為json;關於http請求消息的寫入和http響應的獲取可以查看該方法的實現與MSDN結合看,這樣會有一個比較全面的認識。
最后該方法的返回參數為http響應的狀態碼即200、401等,response.StatusCode是一個枚舉,如果不進行轉換獲得的是 OK、NotFound 這樣的名稱。