WebService介面HTTP報頭設定與獲取
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這個方法還沒有用到!如果,有什麼想法歡迎交流!