- PR -

VBのRemoting使用アプリで長時間接続を維持できません。

1
投稿者投稿内容
H.D.ICE
会議室デビュー日: 2003/12/25
投稿数: 2
投稿日時: 2003-12-25 17:10
初投稿にも関わらず長文失礼致します。

VB.NET2003にて、バッチファイルを定時起動する常駐アプリケーションと、起動日時などの情報を設定するアプリケーションを開発しております。
(どちらもウィンドウベースのAPです)
設定APから常駐APに、設定内容の更新を通知するために、.NETの「リモート処理」機能を利用しました。

しかし、常駐APを長時間(少なくとも2時間以上)起動したままにすると、リンクが切れてしまい、通知が出来なくなります。
設定APで、通知イベント発行メソッドを実行すると、
 System.Runtime.Remoting.RemotingException
 要求されたサービスが見つかりません
が発生します。
一度リンク切れになると、常駐APを再起動するしかなくなります。

MSDNの以下の資料をもとに作成しました:
.NET Framework 開発者ガイド
 >異なるアプリケーション ドメインのオブジェクトどうしの .NET リモート処理によるアクセス
  >リモート処理の例:動的公開
  >リモート処理の例:デリゲートおよびイベント
www.microsoft.com/japan/msdn/library/ja/cpguide/html/cpconaccessingobjectsinotherapplicationdomainsusingnetremoting.asp


接続用DLL「SyncLib.dll」を作成し、両方のAPで参照設定しております。
2つのEXEとDLLはすべて同じフォルダに配置しております。

接続用DLLのソース「SyncLib.vb」:----------------------------------------------
Imports System
Imports System.Runtime.Remoting
Imports System.Collections
<Serializable()> Public Class SubmitEvArgs
Inherits EventArgs
Private _sParam As String = Nothing
Public Sub New(ByVal sParam As String)
Me._sParam = sParam
End Sub
Public ReadOnly Property Param() As String
Get
Return _sParam
End Get
End Property
End Class
Public Delegate Sub SubmissionEventHandler(ByVal sender As Object, _
ByVal submitArgs As SubmitEvArgs)
Public Class SyncObjClass
Inherits MarshalByRefObject
Public Overrides Function InitializeLifetimeService() As Object
Return Nothing
End Function
Public Sub New()
End Sub
Public Event Submission As SubmissionEventHandler
Public Sub Submit(ByVal sParam As String)
Dim e As New SubmitEvArgs(sParam)
RaiseEvent Submission(Me, e)
End Sub
Public ReadOnly Property InstanceHash() As Integer
Get
Return Me.GetHashCode()
End Get
End Property
End Class


常駐APソース抜粋:--------------------------------------------------------------
Public Class frmBatServ
Inherits System.Windows.Forms.Form

Private channel As HttpServerChannel
Private objSync As SyncObjClass

Public Sub New()
MyBase.New()
' この呼び出しは Windows フォーム デザイナで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後に初期化を追加します。
Try
channel = New HttpServerChannel(8080)
ChannelServices.RegisterChannel(channel)
objSync = New SyncObjClass
Dim ref1 As ObjRef = RemotingServices.Marshal(objSync, "SyncCfg")
AddHandler objSync.Submission, AddressOf Me.OnSubmit
Catch ex As Exception

End Try
End Sub

Public Sub OnSubmit(ByVal sender As Object, ByVal args As SubmitEvArgs)
'設定画面から送られたコマンドを処理
'設定画面で作成された情報ファイルの読み込み
End Sub


設定APソース抜粋:--------------------------------------------------------------
Public Class frmConf
Inherits System.Windows.Forms.Form

Private channel As HttpChannel
Private objSync As SyncObjClass

'設定更新通知ボタン押下時に実行されるメソッド
Private Sub f_upd()

'ここで情報ファイルを作成
Try
If IsNothing(channel) = True Then
channel = New HttpChannel(0)
ChannelServices.RegisterChannel(channel)
RemotingConfiguration.RegisterWellKnownClientType(Type.GetType("SyncObjClass, SyncLib"), _
"http://localhost:8080/SyncCfg")
objSync = New SyncObjClass
End If

'submit送信
objSync.Submit("restart")
Catch ex As Exception
'<<<< ここでRemotingExceptionが発生します。    >>>>
'<<<< そうなると常駐APのOnSubmitも実行されません。>>>>
End Try

End Sub

-------------------------------------------------------------------------------

サーバーとなるAPを長時間起動したままでも、リモート接続機能を維持するには、
どうしたらよいでしょうか?

.NETのリモート処理機能を理解するための研究期間も検証期間もほとんど全くない状態での開発のため、至らない点も多々あると思いますが、手がかりになりそうな情報をお持ちの方がいらっしゃいましたら、ご教示願います。
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2003-12-25 21:14
引用:

サーバーとなるAPを長時間起動したままでも、リモート接続機能を維持するには、
どうしたらよいでしょうか?



リースを修正する必要がありそうですね。
にゃおき
会議室デビュー日: 2003/12/09
投稿数: 5
お住まい・勤務地: 新潟県
投稿日時: 2004-02-25 15:28
VB.NETは使ったことないのですが、見た感じiStationさんが指摘されたリースの修正は既に行われているようですね。

一度インスタンス化したオブジェクトを時間を置いてから使用すると、このような状態になることは私も体験しています。
対処として、私は、頻繁にリモートオブジェクトをクライアントでインスタンス化しています。

一応、この方向で対処したところ、いまのところうまくいっています。
1

スキルアップ/キャリアアップ(JOB@IT)