- - PR -
VBのRemoting使用アプリで長時間接続を維持できません。
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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のリモート処理機能を理解するための研究期間も検証期間もほとんど全くない状態での開発のため、至らない点も多々あると思いますが、手がかりになりそうな情報をお持ちの方がいらっしゃいましたら、ご教示願います。 | ||||
|
投稿日時: 2003-12-25 21:14
リースを修正する必要がありそうですね。 | ||||
|
投稿日時: 2004-02-25 15:28
VB.NETは使ったことないのですが、見た感じiStationさんが指摘されたリースの修正は既に行われているようですね。
一度インスタンス化したオブジェクトを時間を置いてから使用すると、このような状態になることは私も体験しています。 対処として、私は、頻繁にリモートオブジェクトをクライアントでインスタンス化しています。 一応、この方向で対処したところ、いまのところうまくいっています。 | ||||
1
