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,我开始写真正的核心逻辑,当您遇到此类问题,是如何解的呢?告诉我,我们一起讨论。:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值