C# POST訪問需要HTTP Digest Authentication認證資源的實現
阿新 • • 發佈:2019-02-20
在你訪問一個需要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 + ":"
- 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 這樣的名稱。