[自我修練][例子]證明Silverlight是無法存取.NET Remoting的

[自我修練][例子]證明Silverlight是無法存取.NET Remoting的

會有這個問題是因為先前有需要,也希望在Silvelight中看看能否存取.NET Remoting的遠端物件,不過當然,在當下每個人都知道Silverlight目前只支援3種資料存取方式:

  1. RIA Service
  2. WCF Data Service (之前稱為ADO.NET Data Service)
  3. WCF Service

不過筆者還是想要Try一下,當有一些不確定因素時筆者就是喜歡踹(是Try拉),行不行Try一下就知道,Try的過程當中也會有一些發現或是了解其原理,二話不說開始吧!

首先筆者記得.NET 3.0之後,因為新增了WCF,所以在Visual Studio 的IDE之中除了原先的加入 [加入參考] [加入Web參考] 之外,還多了 [加入服務參考],這是為了WCF服務而出現的,所以之後,像您現在如果使用如目前最新的visual Studio 2010的WinForm程式在加入服務參考的視窗下面還會有一個 [進階]按鈕,如下圖:

image

點選後,如下畫面:

image

畫面中還有一個加入Web參考的按鈕,在說明的地方也特別標註說這是相容於.NET Framework 2.0的。點選之後就是以前熟悉的Web 參考畫面如下:

image

 

 

而在Silverlight的專案中的[加入服務參考]的畫面中也沒有[加入Web參考]的按鈕,如下:

image

如果硬是在[加入服務參考]的地方輸入.NET Remoting公開的URL (Web Service/SOAP公開的方式),突然很高興的發現!!可以找的到一個服務ㄝ,還能夠分析的出有一個HelloWorldService,如下圖:

image

 

不過按下[確定]後馬上得到一個錯誤訊息,但該錯誤也不是回應出真正的錯誤內容,不過無法作業也是可以想見的!之後說明。

image

而且所產生出來的Reference.c參考檔案也是空空如也,什麼都沒有!如下畫面:

image

為什麼後來筆者有想到原因了呢?因為當您手動敲入Remoting的Proxy也就是遠端物件時,因為該物件必須繼承

System.Web.Services.Protocols.SoapHttpClientProtocol,
但是因為當初Silverlight為了使下載下來的Plug-In安裝檔盡量愈小愈好,所以是沒有包入System.Web.Service.dll這一顆DLL的,所以您根本無法在Silverlight中參考
這一顆DLL以使用NET Remoting 或是 Web Service,這本來在參考的畫面就應該要看出來了!
image 
所以此問題是無解的!!!.. =”=
有看到這裡的朋友還是要謝謝您的耐心... 哈哈 (開玩笑),不過筆者有時候經由實做會想起很多事情,不知道是不是年紀大了忘記很多事情...
不過起碼了解了前因後果。^_^
 
下面是筆者測試用的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/


 

如果文章對您有用,幫我點一下讚,或是點一下『我要推薦,這會讓我更有動力的為各位讀者撰寫下一篇文章。

非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^