WebService接口HTTP报头设置与获取

最近一直在给Android应用写后台接口,WCF不会,只能用很久没有用过的Webservice。用了2天的时间把接口写好,但是接下来的问题让我傻了眼!

    HTTP啊!报头设置啊!获取实体啊!一个都没听过啊!网上有很多的 讲解就是没有具体用法,花了两个星期才做完。接下来就是我为大家总结的方法

一、获取Request实体XML数据

WebService接口HTTP报头设置与获取_第1张图片

 

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列的数据

       这样的数据还不是任你拿捏!到这里还好说方法多下是,下边的几行代码真是愁死我了。

补充数据转换方法:

        /// 
         /// 将xml数据转换为string类型的数据
        /// 
         /// 
         /// 
         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);
         }

        /// 
         /// 将xml的字符串数据转换为DataSet
         /// 
         /// xml字符串
         /// 
         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";

  WebService接口HTTP报头设置与获取_第2张图片

   如上图设置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格式,会将返回的字符串放到的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="210";
             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这个方法还没有用到!如果,有什么想法欢迎交流!





 

你可能感兴趣的:(接口,XML,webservice,HTTP)