Silverlight HttpUtil 封装Post调用

来源:互联网 发布:国网网络大学网址 编辑:程序博客网 时间:2024/06/01 09:56
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
using System.Threading;
using System.Text;


namespace Navi
{
    /*
     * 钟磊 20111127
     * 
     * 封装silverlight 中的Http Post调用
     *          
     * 使用时需要在应用的第一个构造函数中添加语句,否则无法取到Http响应头
     * 
     * bool registerResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
     * 
     * 形如:
     * 
     * public MainPage()
       {
            //For Get Http Header
            bool registerResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);


            InitializeComponent();
     * }
     */


    public class HttpUtil
    {
        /*
         * * 
         * HTTP_CALLBACK 用户调用传入的回调函数
         * success 调用是否成功
         * compress 返回的stream是否是zip过的
         * flag 调用时传入的标记,用以在调用端区分是哪一个的回调
         * responseStream,Http响应传回的流
         */




        public delegate void HTTP_CALLBACK(bool success, bool compress, string flag, Stream responseStream);


        private byte[] _postData = null;
        private SynchronizationContext _syncContext = null;
        private HTTP_CALLBACK _cb = null;
        private string _flag;//当前调用的动作
    


        public HttpUtil(){}




        public void Post(string strPara, string strUrl, string strFlag, HTTP_CALLBACK cb)
        {
            //保存当前调用线程上下文(用户线程)
            _syncContext = SynchronizationContext.Current;
            _cb = cb;
            _postData = Encoding.UTF8.GetBytes(strPara);
            _flag = strFlag;


            Uri endpoint = new Uri(strUrl, UriKind.Absolute);
            HttpWebRequest request = WebRequest.Create(endpoint) as HttpWebRequest;
            request.Method = "POST";
            IAsyncResult asyncResult = request.BeginGetRequestStream(
                new AsyncCallback(callback_resuest), request);
        }


        private  void callback_resuest(IAsyncResult result)
        {
            HttpWebRequest request = result.AsyncState as HttpWebRequest;
            request.ContentType = "application/x-www-form-urlencoded";
            Stream requestStream = request.EndGetRequestStream(result);
            requestStream.Write(_postData, 0, _postData.Length);
            requestStream.Close();
            request.BeginGetResponse(new AsyncCallback(callback_response), request);           
        }


        private void callback_response(IAsyncResult asyncResult)
        {          
            HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;
            WebResponse response = request.EndGetResponse(asyncResult);


            //回调界面,返回用户线程
            _syncContext.Post(callback_ui, response);          
        }




        private void callback_ui(object state)
        {
            HttpWebResponse response = state as HttpWebResponse;                        


            //与服务端约定返回数据是否压缩(ZIP)标志
            bool compress = (response.Headers["COMPRESS"].ToUpper() == "TRUE");


            //与服务端约定的成功标志
            bool success = (response.Headers["RESULT_CODE"].ToUpper() == "OK");


            //回调
            _cb(success,compress,_flag,response.GetResponseStream());
                        
            response.GetResponseStream().Close();
            response.Close();                        
        }
    }

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//这样调用

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Text;
using System.Threading;
using System.IO;
using Navi;
using System.Net.Browser;




namespace Silverlight_HttpDemo
{
   
    public partial class MainPage : UserControl
    {
        private string para = @"
SQL=select * from sys_czyb where rownum < 3
&USER=app_user
&CHARSET=UTF-8
&FUN=select
&COMPRESS=true
&SPLITE_ROW=|
&SPLITE_COL=^
";


        private string url = "http://10.111.43.18:8099/pmias/servlet/db_proc_common";


        


        public MainPage()
        {
            //For Get Http Header
            bool registerResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);


            InitializeComponent();


            para = para.Replace("\r\n", "");
        }
                      
        //请求获取文本
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            new HttpUtil().Post(para, url, "GET_TXT", this.http_cb);            
        }


        //请求获取数据后保存
        Stream savefile;
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            SaveFileDialog sf = new SaveFileDialog();
            
            if (sf.ShowDialog() == true)
            {
                savefile = sf.OpenFile();
                new HttpUtil().Post(para,url,"SAVE_FILE",this.http_cb);
            }
        }


        //回调函数
        private void http_cb(Boolean success,bool compress,string flag,Stream responseStream)
        {
            String fmt = @"成功:{0}
压缩:{1}
内容:{2}";
            string content = "未定义";


            switch (flag)
            {
                case "SAVE_FILE":
                    {                        
                        if (success == false)
                        {               
                            //失败,不写入文件,取出错误信息
                            if (compress)
                                content = ZipUtil.ZipStream2String(responseStream);
                            else
                                content = ZipUtil.Stream2String(responseStream);


                            savefile.Close();                            
                        }
                        else
                        {


                            //成功,将返回的流写入文件
                            if (compress)
                                ZipUtil.ZipStream2File(savefile, responseStream);
                            else
                                ZipUtil.Stream2File(savefile, responseStream);
                            savefile.Close();


                            content = "成功";                            
                        }


                        content = String.Format(fmt, success, compress, content);
                        
                    }
                    break;
                case "GET_TXT":
                    {                        
                        if (compress)
                            content = ZipUtil.ZipStream2String(responseStream);
                        else
                            content = ZipUtil.Stream2String(responseStream);
                        
                        content = String.Format(fmt, success, compress, content);                        
                    }                                     
                    break;
                default:
                    MessageBox.Show("错误的flag:"+flag);
                    break;
            }
            MessageBox.Show(content, "提示", MessageBoxButton.OK);
            
        }
    }
}