[自我修練][例子]證明Silverlight是無法存取.NET Remoting的
會有這個問題是因為先前有需要,也希望在Silvelight中看看能否存取.NET Remoting的遠端物件,不過當然,在當下每個人都知道Silverlight目前只支援3種資料存取方式:
- RIA Service
- WCF Data Service (之前稱為ADO.NET Data Service)
- WCF Service
不過筆者還是想要Try一下,當有一些不確定因素時筆者就是喜歡踹(是Try拉),行不行Try一下就知道,Try的過程當中也會有一些發現或是了解其原理,二話不說開始吧!
首先筆者記得.NET 3.0之後,因為新增了WCF,所以在Visual Studio 的IDE之中除了原先的加入 [加入參考] [加入Web參考] 之外,還多了 [加入服務參考],這是為了WCF服務而出現的,所以之後,像您現在如果使用如目前最新的visual Studio 2010的WinForm程式在加入服務參考的視窗下面還會有一個 [進階]按鈕,如下圖:
點選後,如下畫面:
畫面中還有一個加入Web參考的按鈕,在說明的地方也特別標註說這是相容於.NET Framework 2.0的。點選之後就是以前熟悉的Web 參考畫面如下:
而在Silverlight的專案中的[加入服務參考]的畫面中也沒有[加入Web參考]的按鈕,如下:
如果硬是在[加入服務參考]的地方輸入.NET Remoting公開的URL (Web Service/SOAP公開的方式),突然很高興的發現!!可以找的到一個服務ㄝ,還能夠分析的出有一個HelloWorldService,如下圖:
不過按下[確定]後馬上得到一個錯誤訊息,但該錯誤也不是回應出真正的錯誤內容,不過無法作業也是可以想見的!之後說明。
而且所產生出來的Reference.c參考檔案也是空空如也,什麼都沒有!如下畫面:
為什麼後來筆者有想到原因了呢?因為當您手動敲入Remoting的Proxy也就是遠端物件時,因為該物件必須繼承
System.Web.Services.Protocols.SoapHttpClientProtocol,
但是因為當初Silverlight為了使下載下來的Plug-In安裝檔盡量愈小愈好,所以是沒有包入System.Web.Service.dll這一顆DLL的,所以您根本無法在Silverlight中參考 這一顆DLL以使用NET Remoting 或是 Web Service,這本來在參考的畫面就應該要看出來了!
所以此問題是無解的!!!.. =”=
有看到這裡的朋友還是要謝謝您的耐心... 哈哈 (開玩笑),不過筆者有時候經由實做會想起很多事情,不知道是不是年紀大了忘記很多事情...
不過起碼了解了前因後果。^_^
下面是筆者測試用的Remoting的Web.Config與程式碼 (使用掛載IIS方式,因為Silverlight通常無法跨網域存取,因此放在同一個Site中)
註:HelloWorld遠端物件的部分獨立編譯一個DLL檔案
1.遠端物件
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Web;
5: using System.Runtime.Remoting;
6: using System.Runtime.Remoting.Channels;
7:
8: /// <summary>
9: /// HelloWorld 的摘要描述
10: /// </summary>
11: public class HelloWorld: MarshalByRefObject, IHelloWorld
12: {
13: public string getHelloWorld()
14: {
15: return "Hello World!!!";
16: }
17: }
2.介面檔
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Web;
5:
6: /// <summary>
7: /// IHelloWorld 的摘要描述
8: /// </summary>
9: public interface IHelloWorld
10: {
11: string getHelloWorld();
12: }
3.web.config 的Remoting設定
1: <configuration>
2: <system.runtime.remoting>
3: <application>
4: <service>
5: <wellknown mode="Singleton" type="HelloWorld, HelloWorld" objectUri="HelloWorld.rem"/>
6: </service>
7: <channels>
8: <channel name="MyChannel" priority="100" ref="http"/>
9: </channels>
10: </application>
11: </system.runtime.remoting>
12: <system.web>
13: <compilation debug="true" targetFramework="4.0"/>
14: </system.web>
15: </configuration>
簽名:
學習是一趟奇妙的旅程
這當中,有辛苦、有心酸、也有成果。有時也會有瓶頸。要能夠繼續勇往直前就必須保有一顆最熱誠的心。
軟體開發之路(FB 社團):https://www.facebook.com/groups/361804473860062/
Gelis 程式設計訓練營(粉絲團):https://www.facebook.com/gelis.dev.learning/
如果文章對您有用,幫我點一下讚,或是點一下『我要推薦』,這會讓我更有動力的為各位讀者撰寫下一篇文章。
非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^