Remoting服務器端永久生存期,Web端調用

  保留這篇文章的目的,是有一種場景,就是,當你寫了一個Windows Service(單例,生存期長),你如何能很好的在線管理控制它,我所說的控制,不是簡單的‘開啓’、‘關閉’、‘暫停’、或者發送簡單的無參命令。而是有複雜交互的,客戶端傳送複雜參數,而Windows Serivce會返回複雜的結果,例如:一個DataSet列表,或者一個對象集合等。

  這種解決方案有很多,你可以使用傳統的IPC、郵槽、或者異步的MSMQ,或者WMI、Socket,但本文介紹的這種,是使用Remoting技術。

  爲了要達成目標,我們需要做的如下事情:
  1、建立一個核心服務類(你的Windows Service主邏輯)
  2、將服務器端的單例服務,設置成永久生命期
  3、Remoting建立單例服務端(可以使用任何宿主)
  4、建立在Web客戶端,建立配置,調用服務端


  因爲是一個可行性測試,所以,越簡單越說,主要說明問題,及配置。接下來是實現。
  
  1、建立一個核心服務類 代碼如下:
新建一個類庫項目,取名爲:ClassLibrary.Test
在其中建立兩個類
核心主類Exchange

Public Class Exchange
    Inherits System.MarshalByRefObject
    Private mNextIndex As Integer

    Public Sub New()
        Console.WriteLine("Exchange Started")
        mNextIndex = 100
    End Sub

    Public Function NextOrder() As Order
        mNextIndex += 1
        Console.WriteLine("Exchange NextOrder:" & mNextindex)
        Return New Order(mNextIndex)
    End Function

    Public Overrides Function InitializeLifetimeService() As Object
        'Return MyBase.InitializeLifetimeService()
        Console.WriteLine("Never Lifetime")
        Return Nothing  '不返回,表示無限期的生命週期
    End Function
End Class

還有一個實體類Order
<Serializable()> Public Class Order
    Private mIndex As Integer

    Public Sub New(ByVal index As Integer)
        Console.WriteLine("Order:New:" & index)
        mIndex = index

    End Sub

    Public ReadOnly Property Index() As Integer
        Get
            Console.WriteLine("Order:Index:" & mIndex)
            Return mIndex
        End Get
    End Property
End Class

   2、將服務器端的單例服務,設置成永久生命期
  就是上面代碼的下列部分,直接返回Nothing,就是無限期生命週期
    Public Overrides Function InitializeLifetimeService() As Object
        'Return MyBase.InitializeLifetimeService()
        Console.WriteLine("Never Lifetime")
        Return Nothing  '不返回,表示無限期的生命週期
    End Function


  3、Remoting建立單例服務端(可以使用任何宿主)
   1)建立一個項目,在配置文件app.config中加入如下信息:
  <system.runtime.remoting>
    <application>
      <service>
        <wellknown
                    mode="Singleton"
                    type="ClassLibrary.Test.Exchange, ClassLibrary.Test"
                    objectUri="Exchange" />
      </service>
      <channels>
        <channel port="10001" ref="tcp"/>
      </channels>
    </application>
  </system.runtime.remoting>

    2)在代碼中調用:
        RemotingConfiguration.Configure("Dormice.App.Client.Test.exe.config", False)
    注意:我建立的例子項目名字爲Dormice.App.Client.Test.,你可以改爲自己的。

  4、建立在Web客戶端,建立配置,調用服務端
    1)建立一個Web項目,在配置web.config文件中,配置如下:
 <system.runtime.remoting>
  <application>
   <client>
    <wellknown type="ClassLibrary.Test.Exchange, ClassLibrary.Test" url="tcp://localhost:10001/Exchange"/>
   </client>
   <channels>
    <channel ref="tcp" useDefaultCredentials="true"/>
   </channels>
  </application>
 </system.runtime.remoting>
     2)在Web客戶端後臺代碼中,加入如下代碼:
        'Create proxy to remote object
        Dim url As String = "tcp://localhost:10001/Exchange"
        Dim exchange As Exchange = Activator.GetObject(GetType(Exchange), url)

        'Call remote function
        Dim order As Order = exchange.NextOrder()
        'Console.WriteLine("Client:NextOrder returned:" & order.Index)
        Me.lblOrderIndex.Text = order.Index
   注:lblOrderIndex是一個我建立的label控件,用於顯示結果,以上代碼,我建立了一個Button放在其中。


   以上是我剛剛配置成功的,在此留下痕跡,這裏好像帖不了圖片,不然真想帖上剛剛測試的樣子。我的可行性測試成功,可以向我的Windows Service傳送複雜的參數,或實體對象了。NOW,我開始寫真正的核心邏輯,當您遇到此類問題,是如何解的呢?告訴我,我們一起討論。:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章