Remoting遠程處理事件調用的問題

Remoting遠程處理事件調用的問題
在.NET Remoting技術中可以遠程進行事件通知,但是我在使用時發現問題,提示信息爲:
     不允許類型 System.DelegateSerializationHolder 和從中派生的類型(例如 System.DelegateSerializationHolder)在此安全級別上被反序列化。
但是我把安全級別設的很高,已經完全信任了,可是還是不行,不知道是怎麼一回事?


所有的源代碼如下:

RemoteObj dll的源代碼:
  public class RemoteObj:MarshalByRefObject
    {
        public delegate void TaskCompleteEventHandler(object sender, TaskCompleteEventArgs e);
        public event TaskCompleteEventHandler TaskComplete;
        protected void OnTaskComplete(TaskCompleteEventArgs e)
        {
            if (TaskComplete != null)
            {
                TaskComplete(this, e);
            }
        }
        public void StartTask(int value)
        {
            Thread th = new Thread(new ParameterizedThreadStart((new RemoteObj()).DO));
            th.Start(value);
        }
        /**
         *傳遞的參數必須爲object類型,否則編譯出錯
         **/
        private void DO(object value)
        {
            Thread.Sleep(1000);
            OnTaskComplete(new TaskCompleteEventArgs(value));
        }
    }
    [Serializable()]
    public class TaskCompleteEventArgs : EventArgs
    {
        public object Result;
        public TaskCompleteEventArgs(object result)
        {
            Result = result;
        }
    }
EventListener dll的源代碼:

public class EventListener:MarshalByRefObject
    {
               public void TaskComplete(object sender, TaskCompleteEventArgs e)
        {
            Console.WriteLine("事件返回的值是:  " + e.Result.ToString());
        }
       /**
        * 重寫生存期,限制爲無限生存期,不會被釋放的
        **/
        public override object InitializeLifetimeService()
        {
            return null;
        }
    }

Client客戶端代碼:
 
public class ClientEnd
    {
        static void Main(string[] args)
        {
            Invoke();
        }
        private static void Invoke()
        {
            EventListener listener = new EventListener();
            TcpChannel tcpChannel = new TcpChannel();  //使用Tcp信道
            ChannelServices.RegisterChannel(tcpChannel, false);
            RemoteObj obj = (RemoteObj)Activator.GetObject(typeof(RemoteObj),
        /**
         *   問題:
         * 在此安全基礎上不成執行委託類型的反序列化,但是我已經配置了
         * 完全信任該程序集,怎麼還不行呢,奇怪??
         **/
            obj.TaskComplete += RemoteObj.TaskCompleteEventHandler(listener.TaskComplete);
            obj.StartTask(100);
            Console.ReadLine();
        }
    }

Server服務端代碼:

class ServerEnd
    {
        static void Main(string[] args)
        {
            Console.WriteLine("正在創建服務端連接.......");
            TcpChannel tcpChannel = new TcpChannel(8092);
            ChannelServices.RegisterChannel(tcpChannel, false);
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObj),
                "RemoteObj", WellKnownObjectMode.SingleCall);
            Console.WriteLine("連接創建完畢,可以接收客戶端調用了.....");
            Console.WriteLine("敲回車可以退出服務.....");
            Console.ReadLine();
        }
    }
有誰知道說一下.
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章