一步一步學Remoting之四:承載方式(1) — Windows Service

來源:互聯網
上載者:User
在實際的應用中我們通常只會選擇用windows服務和iis來承載遠程對象。選擇windows服務的原因是能自啟動服務,伺服器重啟後不需要再去考慮啟動service。選擇iis的理由是我們能使用整合驗證等一些iis的特性。
在msdn中可以找到相關文章:

http://www.microsoft.com/china/msdn/library/architecture/architecture/architecturetopic/BuildSucApp/BSAAsecmodsecmod29.mspx

http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconRemotingExampleHostingInIIS.asp

可能大家會覺得這個過程將是一個複雜的過程,其實不然,下面說一下實現方法,步驟非常少。

先來建立遠程對象 using System; 
using System.Data;
using System.Data.SqlClient;

namespace RemoteObject 

    public class MyObject:MarshalByRefObject 
    { 
        public DataSet GetData()
        {
            SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["strconn"]);
            SqlDataAdapter da=new SqlDataAdapter("select * from UBI_ProvinceMaster",conn);
            DataSet ds=new DataSet();
            da.Fill(ds);
            return ds;
        }
    }

用戶端仍然是一個控制台來進行測試: RemoteObject.MyObject app = (RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]);
            DataTable dt=app.GetData().Tables[0];
            foreach(DataRow dr in dt.Rows)
            {
                Console.WriteLine(dr["iPrMId"]+" "+dr["vPrMName"]);
            }
            Console.ReadLine();

服務端設定檔: <configuration>
    <appSettings>
            <add key="strconn" value="server=(local);uid=sa;pwd=;database=UBISOFT" />
    </appSettings>
    <system.runtime.remoting>
        <application name="RemoteServer">
            <service>
                <wellknown type="RemoteObject.MyObject,RemoteObject" objectUri="RemoteObject.MyObject"
                    mode="SingleCall" />
            </service>
            <channels>
                <channel ref="tcp" port="9999"/>
            </channels>
        </application>
    </system.runtime.remoting>
</configuration>

運行程式,我們得到的是一個省市的列表:

一、windows服務承載
用vs.net製作一個windows服務的過程基本不超過10個步驟,所以我們不需要害怕。
1、建立一個新的windows服務項目RemoteServer1
2、開啟Service1程式碼檢視,找到OnStart部分,加入代碼

System.Runtime.Remoting.RemotingConfiguration.Configure(AppDomain.CurrentDomain.BaseDirectory + "RemoteServer1.exe.config");

(不要遺漏AppDomain.CurrentDomain.BaseDirectory + )
config和控制台方式的config是一樣的,我們讓這個windows服務做的僅僅是從config檔案讀出配置資訊進行配置通道。別忘記添加設定檔。
3、切換到設計檢視,右鍵-添加安裝程式
4、切換到新產生的ProjectInstaller.cs設計檢視,找到serviceProcessInstaller1對Account屬性設定為LocalSystem,對serviceInstaller1的ServiceName屬性設定為RemoteServer1(服務的名字),StartType屬性設定為Automatic(系統啟動的時候自動啟動服務)
5、別忘記對添加RemoteObject的引用
6、建立一個新的安裝項目RemoteServerSetup(我們為剛才那個服務建立一個安裝項目)
7、右鍵-添加-項目輸出-主輸出-選擇RemoteService1-確定
8、右鍵-視圖-自訂動作-自訂動作上右鍵-添加自訂動作-開啟應用程式檔案夾-選擇剛才那個主輸出-確定
9、重建這個安裝項目-右鍵-安裝
10、在服務管理員中(我的電腦-右鍵-管理-服務和應用程式-服務)找到RemoteServer1服務,啟動服務
現在就可以開啟用戶端測試了!

一些FAQ:
1、啟動服務的時候系統說了類似“服務什麼都沒有做,服務已經被停止”表示什嗎?
表示windows服務出錯了,一般是服務的程式有問題,檢查服務做了什嗎?在我們這個程式中僅僅添加了一行代碼,一般不會出現這個錯誤。
2、運行用戶端出現“伺服器無響應”?
先檢查windows服務組態檔是不是正確設定了啟用方式和啟用物件,用戶端服務端連接埠號碼是否統一?
3、運行用戶端出現“無法找到程式集”?
檢查windows服務組態檔是否正確配置了啟用物件的類型和uri?服務是否添加了遠程對象引用?
4、遠程對象類中有用到System.Configuration.ConfigurationSettings.AppSettings["strconn"],但是遠程對象並沒有設定檔,它從哪裡讀取這個config的?
因為遠程對象不是獨立存在的,它是被windows服務承載的,因此它從windows服務的設定檔中讀取一些配置資訊,遠程對象本生不需要設定檔。
5、安裝的時候是不是要卸載服務?
不需要,安裝程式會 停止服務端-》卸載服務-》安裝服務
6、在正式使用的時候怎麼部署我們的系統?
如果用戶端是程式僅僅只要把安裝項目下面3個檔案傳到伺服器進行安裝,配置好config檔案(比如連接字串),開啟服務即可。如果用戶端是網站,同樣把服務在伺服器安裝,配置好config檔案(比如連接字串),開啟服務,最後把網站傳到web伺服器(可能和service不是同一個伺服器)。
7、部署的時候需要傳遠程對象dll嗎?
不需要,可以看到安裝項目中已經自動存在了這個dll。
8、這樣的系統有什麼特點?
一個web伺服器,多個service伺服器,多個sqlservice伺服器,web伺服器負擔比較小,所有的邏輯代碼都分布到不同的service伺服器上面。

最後說一個測試的tip:
如果我們遠程調用對象進行測試程式非常麻煩,我們需要這麼做
修改了遠程對象-》重新編譯安裝程式-》在自己機器重新安裝服務-》啟動服務-》查看結果
其實可以這麼做:
1、修改遠程對象中的串連資料庫字串,由於不是遠程對象了,我們必須從本地讀取連接字串,比如上列我們直接修改為:
SqlConnection conn=new SqlConnection("server=(local);uid=sa;pwd=;database=UBISOFT");
2、修改用戶端代碼,直接執行個體化遠程對象 //RemoteObject.MyObject app = (RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]);
            RemoteObject.MyObject app = new RemoteObject.MyObject();

等到正式部署的時候我們還原資料庫連接字串從config檔案中讀取,還原遠程對象從遠程讀取即可。

如果對windows服務還不是很清楚,請看以下文章:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbwlkwalkthroughcreatingwindowsserviceapplication.asp

http://www.cnblogs.com/lovecherry/archive/2005/03/25/125527.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.