一步一步學Remoting之一:從簡單開始

來源:互聯網
上載者:User

一步一步學Remoting之一:從簡單開始

一、Remoting的優缺點?
優點:
1、能讓我們進行分布式開發
2、Tcp通道的Remoting速度非常快
3、雖然是遠端,但是非常接近於本地調用對象
4、可以做到保持對象的狀態
5、沒有應用程式限制,可以是控制台,winform,iis,windows服務承載遠程對象
缺點:
1、非標準的應用因此有平台限制
2、脫離iis的話需要有自己的安全機制

二、Remoting和Web服務的區別?
    ASP.NET Web 服務基礎結構通過將 SOAP 訊息映射到方法調用,為 Web 服務提供了簡單的 API。通過提供一種非常簡單的編程模型(基於將 SOAP 訊息交換映射到方法調用),它實現了此機制。ASP.NET Web 服務的用戶端不需要瞭解用於建立它們的平台、物件模型或程式設計語言。而服務也不需要瞭解向它們發送訊息的用戶端。唯一的要求是:雙方都要認可正在建立和使用的 SOAP 訊息的格式,該格式是由使用 WSDL 和 XML 結構描述 (XSD) 表示的 Web 服務合約定義來定義的。 
    . NET Remoting 為分布式對象提供了一個基礎結構。它使用既靈活又可擴充的管線向遠程進程提供 .NET 的完全對象語義。ASP.NET Web 服務基於訊息傳遞提供非常簡單的編程模型,而 .NET Remoting 提供較為複雜的功能,包括支援通過值或引用傳遞對象、回調,以及多個物件啟用和生命週期管理原則等。要使用 .NET Remoting,用戶端需要瞭解所有這些詳細資料,簡而言之,需要使用 .NET 建立用戶端。.NET Remoting 管線還支援 SOAP 訊息,但必須注意這並沒有改變其對用戶端的要求。如果 Remoting 端點提供 .NET 專用的對象語義,不管是否通過 SOAP,用戶端必須理解它們。

三、最簡單的Remoting的例子
1、遠程對象:
建立類庫項目:RemoteObject

using System;

namespace RemoteObject
{
    public class MyObject:MarshalByRefObject
    {
        public int Add(int a,int b)
        {
            return a+b;
        }
    }
}

2、服務端
建立控制台項目:RemoteServer

using System;
using System.Runtime.Remoting;

namespace RemoteServer
{
    class MyServer
    {
        [STAThread]
        static void Main(string[] args)
        {
            RemotingConfiguration.Configure("RemoteServer.exe.config");
            Console.ReadLine();
        }
    }
}

建立設定檔:app.config

<configuration>
    <system.runtime.remoting>
        <application name="RemoteServer">
            <service>
                <wellknown type="RemoteObject.MyObject,RemoteObject" objectUri="RemoteObject.MyObject"
                    mode="Singleton" />
            </service>
            <channels>
                <channel ref="tcp" port="9999"/>
            </channels>
        </application>
    </system.runtime.remoting>
</configuration>

3、用戶端:
建立控制台項目:RemoteClient

using System;

namespace RemoteClient
{
    class MyClient
    {
        [STAThread]
        static void Main(string[] args)
        {
            RemoteObject.MyObject app = (RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]);
            Console.WriteLine(app.Add(1,2));
            Console.ReadLine();
        }
    }
}


建立設定檔:app.config

<configuration>
 <appSettings>
 <add key="ServiceURL" value="tcp://localhost:9999/RemoteObject.MyObject"/>
 </appSettings>
</configuration>

4、測試
在最後編譯的時候會發現編譯報錯:
1、找不到app.Add()
2、找不到RemoteObject
這是因為用戶端RemoteClient沒有添加RemoteObject的引用,編譯器並不知道遠程對象存在哪些成員所以報錯,添加引用以後vs.net會在用戶端也儲存一個dll,可能大家會問這樣如果對遠程對象的修改是不是會很麻煩?其實不麻煩,對項目編譯一次vs.net會重新複製dll。
然後直接運行用戶端會出現“目標主機拒絕”的異常,也說明了通道沒有開啟
運行服務端再運行用戶端出現“找不到程式集RemoteObject”!回頭想想可以發現我們並在服務端對RemoteObject添加引用,編譯的時候通過是因為這個時候並沒有用到遠程對象,大家可能不理解運行服務端的時候也通過?這是因為沒有這個時候還沒有啟用遠程對象。理所當然,對服務端要添加引用遠程對象,畢竟我們的對象是要靠遠程承載的。
現在再先後運行服務端程式和用戶端程式,用戶端程式顯示3,測試成功。

四、結束語
我們通過一個簡單的例子實現了最簡單的remoting,對其實質沒有做任何介紹,我想通過例子入門才是最簡單的。

連結地址: http://lovecherry.cnblogs.com/archive/2005/05/19/158784.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.