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

關於HTTP協議請看這篇博文

 

       在你訪問一個需要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 這樣的名稱。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章