1. 程式人生 > >WebService介面HTTP報頭設定與獲取

WebService介面HTTP報頭設定與獲取

最近一直在給Android應用寫後臺介面,WCF不會,只能用很久沒有用過的Webservice。用了2天的時間把介面寫好,但是接下來的問題讓我傻了眼!

    HTTP啊!報頭設定啊!獲取實體啊!一個都沒聽過啊!網上有很多的 講解就是沒有具體用法,花了兩個星期才做完。接下來就是我為大家總結的方法

一、獲取Request實體XML資料

Stream sm = Context.Request.InputStream;  ////獲取Request 實體資料

      string xml = GetPostData(sm);  //將xml資料轉換為string型別的資料

      string useragent =Context.Request.UserAgent.ToString();    //獲取User-Agent裡包含的資料

      ///為了方便資料的讀取(用xml獲取節點獲取真的很麻煩)將string型別的xml資料轉換為 DataSet

      DataSet ds = GetDataSetByXml(xml);  

       注:ds.Tables[0].Columns[j].ToString();   //獲取列頭名;

              ds.Tables[0].Rows[0][0].ToString();   //獲取第0行0列的資料

       這樣的資料還不是任你拿捏!到這裡還好說方法多下是,下邊的幾行程式碼真是愁死我了。

補充資料轉換方法:

        /// <summary>
         /// 將xml資料轉換為string型別的資料
        /// </summary>
         /// <param name="sm"></param>
         /// <returns></returns>
         public static string GetPostData(System.IO.Stream sm)
         {
             int len = (int)sm.Length;
             byte[] inputByts = new byte[len];
             sm.Read(inputByts, 0, len);
             sm.Close();

            return Encoding.Default.GetString(inputByts);
         }

        /// <summary>
         /// 將xml的字串資料轉換為DataSet
         /// </summary>
         /// <param name="xmlData">xml字串</param>
         /// <returns></returns>
         public static DataSet GetDataSetByXml(string xmlData)
         {
             try
             {
                 DataSet ds = new DataSet();

                using (StringReader xmlSR = new StringReader(xmlData))
                 {

                    ds.ReadXml(xmlSR, XmlReadMode.InferTypedSchema);  //忽視任何內聯架構,從資料推斷出強型別架構並載入資料。如果無法推斷,則解釋成字串資料
                    if (ds.Tables.Count > 0)
                     {
                         return ds;
                     }
                 }
                 return null;
             }
             catch (Exception)
             {
                 return null;
             }
         } 

二、設定報頭方法

 設定Cache-Control單屬性:Context.Response.CacheControl = "no-cache";

 

   如上圖設定Cache-Control多屬性:

         Context.Response.Cache.SetMaxAge(TimeSpan.Zero);   //新增max-age=0;

         string date = DateTime.Parse("Thu, 01 Jan 1970 00:00:00 GMT").ToString("yyyy-MM-dd HH:mm:ss");
         Context.Response.Cache.SetExpires(Convert.ToDateTime(date));   //設定Expires:Thu, 01 Jan 1970 00:00:00 GMT
         Context.Response.Cache.SetNoStore();    //新增no-store;
         Context.Response.AddHeader("Pragma", "No-cache");  //新增Pragma:no-cache
         Context.Response.AddHeader("Content-Type", "text/xml");    //新增Content-Type=text/xml;

三、設定WebService返回資料型別

       預設返回型別為XML格式,會將返回的字串放到<string></string>的xml節點下,以下是自己想要返回什麼自己控制,data是返回的資料。

             Context.Response.Charset = "UTF-8";
             Context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");
             Context.Response.Write(data);
             Context.Response.End();

            //為了方便測試是否獲取到了應用的請求資訊,用了兩個方法

            ///將string字串放入資料夾

            string fullPath ="D:/a.txt";
             using (StreamWriter sw = new StreamWriter(fullPath, false, Encoding.Default))
             {
                 sw.WriteLine(s[5]);
             }

            ///將xml格式的string資料放進資料夾


             string xml="<request><uid>2</uid><p_id>1</p_id><source_type>0</source_type></request>";
             XmlDocument xmldoc = new XmlDocument();
             xmldoc.LoadXml(xml1);
             xmldoc.Save("D:/data.xml");

----------------------------------------------------------分割線--------------------------------------------------------

修改:一、獲取Request 實體資料

用InputStream直接獲取HTTP輸入流實體:Stream sm = Context.Request.InputStream; 有時資料會報獲取xml時,出現“(十六進位制值 0x1F)是無效的字元之類Xml異常。解決方法如下:

在上面程式碼下新增

             StreamReader sr = new StreamReader(sm, System.Text.Encoding.UTF8);
             string requestXml = sr.ReadToEnd();

這樣獲取實體時就會按照UTF8的編碼來讀取。自然string xml = GetPostData(sm);這行程式碼和GetPostData()方法也就不需要了!

至於Context.Request.Form這個方法還沒有用到!如果,有什麼想法歡迎交流!