網頁間的物件傳遞
通常網頁之間物件的傳遞會利用Session來存放物件,但如果不利用Session或者是兩個網頁是在不同的SERVER上,
就又有許多不同的做法了,最近剛好有碰到這樣的問題,因為架構和安全性的關係,
要利用 A Server發出Request給另外一台B Server,
再由B Server向C Server發出Request取得Response後,再把Response丟回給A Server再存回某台DB ,
查了一些資料後最後利用HttpWebRequest來做,並且小小實驗了一下~
這邊簡單化一點,兩個網頁就好了。
首先開了三個專案,兩個網頁程式和一個Class專案。並且讓A與B專案都參考到Testobject這個專案。
先來設計一下物件的內容,隨便給他兩個屬性就好了~
由於物件之後需要序列化,所以必須標示為可序列化~
public class Testobject
{
public string ValueA { get; set; }
public string ValueB { get; set; }
}
接著在ServerA網頁上放個按鈕,該按鈕會呼叫BServer的網頁並且把物件傳遞過去
接著就開始寫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網站實驗
執行結果~
以上是東看西看自己亂弄出來的= =,也許還有更好的辦法~~參考了不少資料..