網頁間的物件傳遞

網頁間的物件傳遞

通常網頁之間物件的傳遞會利用Session來存放物件,但如果不利用Session或者是兩個網頁是在不同的SERVER上,

就又有許多不同的做法了,最近剛好有碰到這樣的問題,因為架構和安全性的關係,

要利用 A Server發出Request給另外一台B Server,

再由B Server向C Server發出Request取得Response後,再把Response丟回給A Server再存回某台DB ,1775465369

查了一些資料後最後利用HttpWebRequest來做,並且小小實驗了一下~

這邊簡單化一點,兩個網頁就好了。

首先開了三個專案,兩個網頁程式和一個Class專案。並且讓A與B專案都參考到Testobject這個專案。

image

先來設計一下物件的內容,隨便給他兩個屬性就好了~

由於物件之後需要序列化,所以必須標示為可序列化~


    public class Testobject
    {
        public string ValueA { get; set; }
        public string ValueB { get; set; }
    }

接著在ServerA網頁上放個按鈕,該按鈕會呼叫BServer的網頁並且把物件傳遞過去

image

接著就開始寫CODE了~

 

首先是把建立物件~


            obj.ValueA = txtValueA.Text;
            obj.ValueB = txtValueB.Text;

 

建立HttpWebRequest


            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serverAddress);//建立HttpWebRequest

 

再來就要準備傳入物件了,利用HttpWebRequest建立Request的資料串流來寫入資料,但要把物件序列化為二進位資料。

因此先準備序列化和反序列化的方法:


    {
        /// <summary>
        /// 將物件序列化為byte
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static byte[] ObjectToBinary(object o)
        {
            SoapFormatter sof = new SoapFormatter();
            MemoryStream ms = new MemoryStream();
            sof.Serialize(ms, o);
            ms.Position = 0;
            return ms.GetBuffer();
        }

        /// <summary>
        /// 將byte資料反序列化為物件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="buf"></param>
        /// <returns></returns>
        public static T BinaryToObject<T>(byte[] buf)
        {
            SoapFormatter sof = new SoapFormatter();
            MemoryStream ms = new MemoryStream(buf);
            object o = sof.Deserialize(ms);
            return (T)o;
        }
    }

接著把物件序列化後,寫入Request資料串流~


            request.Method = "POST";
            request.ContentLength = buf.Length;
            request.KeepAlive = false;
            Stream sm=request.GetRequestStream();//取得資料流
            sm.Write(buf, 0, buf.Length);//寫入資料
            sm.Close();

最後要取得B網頁的Response,再把B網頁的Response秀在網頁上~


            StreamReader sr = new StreamReader(Responsesm);
            string ResponseContent = sr.ReadToEnd();
            Response.Write(ResponseContent);

 

這樣A網頁的部分就完成了,接著來寫收到物件的B網頁。

在B網頁Page_Load的時候,取得Request的資料串流~

再將他反序列化。最後Response出取得的資料

 


        {
            if (Request.InputStream != null && Request.InputStream.Length > 0)
            {
                byte[] buf = new byte[Request.InputStream.Length];
                Request.InputStream.Read(buf, 0, buf.Length);//把資料串列寫到byt陣列
                Testobject obj = SerializableTool.BinaryToObject<Testobject>(buf);
                Response.Write("取得物件ValueA資料為" + obj.ValueA + @"<br/>");
                Response.Write("取得物件ValueB資料為" + obj.ValueB + @"<br/>");
            }
        }

 

最後就可以來實驗拉~這裡利用VPC來當B網站實驗

執行結果~

image

以上是東看西看自己亂弄出來的= =,也許還有更好的辦法~~參考了不少資料..

專案檔下載