2013年4月5日 星期五
如何用C# 寫成 COM+ 物件後然後使用 asp 調用 custom class Array(PHP就不用和麼麻煩) => Retrieve Custom class array from COM object using Classic ASP
我現在在維護一些傳統 asp 網頁,裡面會使用到我自己寫的 COM (C#),然後把他安裝到元件服務。
我所需要的回傳物件 data 格式為下
public class eTicket_Info : ServicedComponent, IeTicket_Info
{
public int OrderBulkNo { get; set; }
public string Pno { get; set; }
public string agentId { get; set; }
public string rloc { get; set; }
public DateTime rlocCreateDate { get; set; }
public string OfficeID { get; set; }
public string SessionKey { get; set; }
public string IATA_Number { get { return "3XXXX615"; } }
public string Issuing_Agent { get { return "AXXX"; } }
public string Issuing_Agent_Location { get { return "XXX"; } }
public object flight_Detail_Info {
[return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)] get;
set; } //Flight_Detail_Info
public object members_simple_Info {
[return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)] get;
set; } // Members_simple_Info
}
嚐試過很多次,總算找到對的方法,因為不知如何調用 members_simple_Info [],最後發現是必須使用。
[return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)] get
然後其實回傳的是 array。而且他的 Type 請放 object,VB喜歡這樣,如果傳回他原本的 Type,會有 error
在 Implementation class 裡需要這樣寫才才行
var _fdCount = _fd.Count();
if (_fdCount > 0)
{
data.flight_Detail_Info = new Flight_Detail_Info[_fdCount];
data.flight_Detail_Info = _fd.Cast<object>().ToArray();
}
else
data.flight_Detail_Info = null;
在 asp 裡請這樣寫,重點是,這樣寫後,我可以直接把 array 指定給參數(以下藍字)
Dim data
Set data = PNRObj.retrievePNR((PNR), (OrderBulkNo), (O_autoindex), (ms_sno) )
response.write "data.rloc(8):" & data.Issuing_Agent
'Set paxs = data.members_simple_Info
if IsArray(data.members_simple_Info) then Response.Write("IsArray") & "<br />"
Response.Write( "VarType(data.members_simple_Info:" & VarType(data.members_simple_Info)) & "<br />"
Response.Write("UBound:" & UBound(data.members_simple_Info)) & "<br />"
Response.Write("VarType(data.flight_Detail_Info):" & VarType(data.flight_Detail_Info)) & "<br />"
Response.Write("UBound:" & UBound(data.flight_Detail_Info)) & "<br />"
if UBound(data.members_simple_Info)>=0 then
paxs = data.members_simple_Info
For Each pax In paxs
response.write pax.firstname & "<br />"
Next
end if
if UBound(data.flight_Detail_Info)>=0 then
flights = data.flight_Detail_Info()
For Each flight In flights
response.write flight.fltConxFrom & "<br />"
Next
end if
大功告成
Improvement:
看可不可以簡化 C# 那裡的 code, 再跟大家做報告
2013年2月28日 星期四
C# Serviced Component architecture: Best Practice for Enterprise 企業所需的程式架構1:原有32-bit元件怎麼辦?PHP也可接喔
花了好多時間建置和測試 C# 的 Serviced Component,測試和建置結果對於企業級的公司有很大的好處,為何呢?要做到3層式(或多層式)架構對企業來說是非常重要的,因為如果企業如果遇到要加新的功能,或 expose 原有的功能到新的 presentation layer (mobile 手機, iPad, 等)那你就一定要把 presentation - business - data , web service etc 等都分開來為不同的 layer,來取得可以改變程式架構的空間,當然複雜度也會增加,但因為不同的部分都會由不同的工程師來負責,所以也可以讓多人同時工作。
市面上 Serviced Component 書很少,不然就是很舊,然後 Microsoft 又一直說要改成 WCF,但根本就一樣概念的東西。。。。只是需要判斷不同的 techonogy 需要在何時情況才用。
好了,不廢話了,直接把結果說出來:
把既有的 business, data component 等 ( C# or vb6 or etc.),放在你已有的地方不要動,多做出一層 ServiceComLayer.cs 把你要 expose的 functions 使用 繼承 ServicedComponent 來 expose 出來給其他的不管是 Delphi, VB6, PHP, classic asp,只要是32-bit window,他都吃。(不用每個 class 繼承 servicedComponent)
我知道你會說,等等,不是要 64-bit 時代了,你還在管 32-bit?
1. 你不可能每次都做新的功能或案子,就不理舊的東西,企業需要延續性
2. 就算是新技術,此確保舊功能(dll 元件)都還可以用,在加上新的功能(技術)時,延伸就好了。因為你的核心已是C# 最新的framework,你只是 expose 給其他技術(或平台)做連接, e.g. PHP也可喔,ASP.NET無敵慢。
3. 連接 third party Component 然後 expose到你現有(32-bit app, vb6 etc) 或新的 C# application都可以。
4. 做成 web service給 application 或網站使用,執行效率太差了~
5. 如何服務 mobile application, 之後我再發表吧。。。。這樣一來,同一套程式,不用寫那麼多次。。。。只要改presentation layer就好了。
如果你覺得沒用,可能你貴公司不是在此企業架構下,就不用想那麼多啦~!
就算是 Wall Street Journal 也還有很多 classic asp (http://chinese.wsj.com/big5/index.asp)頁面,PHP頁面(https://secure.wsj-asia.com/subscription1/index.php),這不是一時三刻改得完,或怎是企業覺得沒有必要去換成新的網頁技術(因為舊的還很好用)。那以上文章可幫助你朝這方向前進。
市面上 Serviced Component 書很少,不然就是很舊,然後 Microsoft 又一直說要改成 WCF,但根本就一樣概念的東西。。。。只是需要判斷不同的 techonogy 需要在何時情況才用。
好了,不廢話了,直接把結果說出來:
把既有的 business, data component 等 ( C# or vb6 or etc.),放在你已有的地方不要動,多做出一層 ServiceComLayer.cs 把你要 expose的 functions 使用 繼承 ServicedComponent 來 expose 出來給其他的不管是 Delphi, VB6, PHP, classic asp,只要是32-bit window,他都吃。(不用每個 class 繼承 servicedComponent)
我知道你會說,等等,不是要 64-bit 時代了,你還在管 32-bit?
1. 你不可能每次都做新的功能或案子,就不理舊的東西,企業需要延續性
2. 就算是新技術,此確保舊功能(dll 元件)都還可以用,在加上新的功能(技術)時,延伸就好了。因為你的核心已是C# 最新的framework,你只是 expose 給其他技術(或平台)做連接, e.g. PHP也可喔,ASP.NET無敵慢。
3. 連接 third party Component 然後 expose到你現有(32-bit app, vb6 etc) 或新的 C# application都可以。
4. 做成 web service給 application 或網站使用,執行效率太差了~
5. 如何服務 mobile application, 之後我再發表吧。。。。這樣一來,同一套程式,不用寫那麼多次。。。。只要改presentation layer就好了。
如果你覺得沒用,可能你貴公司不是在此企業架構下,就不用想那麼多啦~!
就算是 Wall Street Journal 也還有很多 classic asp (http://chinese.wsj.com/big5/index.asp)頁面,PHP頁面(https://secure.wsj-asia.com/subscription1/index.php),這不是一時三刻改得完,或怎是企業覺得沒有必要去換成新的網頁技術(因為舊的還很好用)。那以上文章可幫助你朝這方向前進。
訂閱:
文章 (Atom)