解决“不允许类型 System.DelegateSerializationHolder 和从中派生的类型(例如 System

转载 2007年09月18日 12:57:00

解决“不允许类型 System.DelegateSerializationHolder 和从中派生的类型(例如 System.DelegateSerializationHolder)在此安全级别上被反序列化”错误的办法。
在.NET Framework 1.1中安全级别默认是Low的,所以不能被反序列化。以下代码是是一个聊天程序,在修改了配置文件后就可以访问了。


远程处理程序:ChatCoordinator.cs

using System;
using System.Runtime.Remoting;
using System.Collections;

[Serializable]
public class SubmitEventArgs : EventArgs{

   private string _string = null;
   private string _alias = null;

   public SubmitEventArgs(string contribution, string contributor){
      this._string = contribution;
      this._alias = contributor;
   }

   public string Contribution{
      get{
         return _string;
      }
   }

   public string Contributor{
      get {
         return _alias;
      }   
   }
}

public delegate void SubmissionEventHandler(object sender, SubmitEventArgs submitArgs);

public class ChatCoordinator : MarshalByRefObject{

   public ChatCoordinator(){
     Console.WriteLine("聊天控制对象已经建立。 实例: " + this.GetHashCode().ToString());
   }
   public override object InitializeLifetimeService(){
      return null;
   }
   public event SubmissionEventHandler Submission;

   public void Submit(string contribution, string contributor){
      Console.WriteLine("{0} 发送: {1}.", contributor, contribution);

      SubmitEventArgs e = new SubmitEventArgs(contribution, contributor);

      if (Submission != null){
  Console.WriteLine("广播……");
         Submission(this, e);
      }
   }
}

宿主应用程序:Server.cs

using System;
using System.Runtime.Remoting;

public class Server
{
   public static void Main(string[] Args)
   {
  RemotingConfiguration.Configure("Central.config");
  Console.WriteLine("服务已经启动。 按回车键退出。");
  Console.ReadLine();
   }
}

客户端应用程序:client.cs

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;

public class ChatClient : MarshalByRefObject {

   private string username = null;

 public override object InitializeLifetimeService() {
      return null;
   }

   public ChatClient(string alias){
       
      this.username = alias;
   
   }

   public void Run(){
   
      RemotingConfiguration.Configure("Client.config");
      ChatCoordinator chatcenter = new ChatCoordinator();
      chatcenter.Submission += new SubmissionEventHandler(this.SubmissionReceiver);
      String keyState = "";
       
      while (true){
         Console.WriteLine("按0和回车键退出:/r/n");
         keyState = Console.ReadLine();

         if (String.Compare(keyState,"0", true) == 0)
            break;
         chatcenter.Submit(keyState, username);
      }
      chatcenter.Submission -= new SubmissionEventHandler(this.SubmissionReceiver);
   }

 public void SubmissionReceiver(object sender, SubmitEventArgs args){

 if (String.Compare(args.Contributor, username, true) == 0){
         Console.WriteLine("你的消息经被广播。。");
      }
      else
         Console.WriteLine(args.Contributor + " 说: " + args.Contribution);
      }

   public static void Main(string[] Args){

      if (Args.Length != 1){
         Console.WriteLine("You need to type an alias.");
         return;
      }

      ChatClient client = new ChatClient(Args[0]);
         client.Run();
      }
}

服务器端配置文件:Central.config

<configuration>
  <system.runtime.remoting>
    <application>
      <service>
        <wellknown mode="Singleton" type="ChatCoordinator, ChatCoordinator" objectUri="Chat" />
      </service>
      <channels>
        <channel ref="http" port="8080">
          <!--
              以下红颜色的部分是控制按级别的
              Full: .NET 远程处理的完全反序列化级别。它在所有情况下都支持远程处理所支持的全部类型。
              Low: .NET 远程处理的低反序列化级别。它支持与基本的远程处理功能相关联的类型。
   -->
          <serverProviders>
            <provider ref="wsdl" />
            <formatter ref="soap" typeFilterLevel="Full" />
            <formatter ref="binary" typeFilterLevel="Full" />
          </serverProviders>
        </channel>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

客户端配置文件:Client.config

<configuration>
  <system.runtime.remoting>
    <application>
      <client>
        <wellknown type="ChatCoordinator, ChatCoordinator" url="http://localhost:8080/Chat" />
      </client>
      <channels>
        <channel ref="http" port="0">
          <!--以下红颜色的部分是控制按级别的-->
          <serverProviders>
            <provider ref="wsdl" />
            <formatter ref="soap" typeFilterLevel="Full" />
            <formatter ref="binary" typeFilterLevel="Full" />
          </serverProviders>
        </channel>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

在该目录中的命令提示处,键入以下命令就可以运行了:

csc /t:library ChatCoordinator.cs

csc /r:ChatCoordinator.dll server.cs

csc /r:ChatCoordinator.dll client.cs


 

解决“不允许类型 System.DelegateSerializationHolder 和从中派生的类型(例如 System.DelegateSerializationHolder)在此安全级别上被反序列化”错误的办法。

解决“不允许类型 System.DelegateSerializationHolder 和从中派生的类型(例如 System.DelegateSerializationHolder)在此安全级别上被反...
  • esshs
  • esshs
  • 2005年03月24日 11:32
  • 1590

Java中使用System.out.printf().如何控制输出格式及类型不一致的解决方法

首先解决输出的类型不一致: 例如我想要打印出九九乘法表: public class jiujiu { public static void main(String[] args) { for(...

UIButton-system类型 动态改变title 显示文字时闪动(解决方案)

今天发现动态改变button title时会出现闪动.很蛋疼的问题,后来经过反复尝试,发现一个解决方案. dispatch_queue_t queue = dispatch_get_global_qu...

Linq中字段数据类型转换问题(Linq to entity,LINQ to Entities 不识别方法"System.String ToString()"问题解决)

1、在工作中碰到这样一个问题: 使用linq时,需要查询两个表,在这两张表中关联字段分别是int,和varchar()也就是string,在linq中对这两个字段进行关联, 如果强制类型转换两个不同类...

未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral……”中加载类型的问题解决

之前部署完成的网站今天却无法打开,浏览器报出错误: 未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyTo...

无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型:解决方法

http://blog.csdn.net/xiaochongchong1248/archive/2009/11/20/4841193.aspx?1271573283 编程环境要求:VS2008/FX2...

解决:GridView提示无法将类型为“System.Web.UI.LiteralControl”的对象强制转换为类型...

在GridView中,有时候我们会使用其自带的CmmandField中的一些操作按钮,比如删除更新等。这里重点提到删除这个按钮,有的人在时候这个按钮的时候没有把其转换为模板列。但是又想在点击该按钮的时...

序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用

根据我们不同的需要,我们会在不同的时候选择序列化和反序列化,从而得到我们想要的对象或者字符串。     今天在用MVC+EF做一个简单查询的时候,当返回json格式的数据时出现问题了。 ...

强化System.Convert.ChangeType, 使其能够转换枚举ENUM和可空类型Nullable

反射操作时经常遇到类型转换操作,但系统的System.Convert.ChangeType不支持枚举ENUM和可空类型Nullable转换。 使用强化版System.Convert.ChangeTy...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决“不允许类型 System.DelegateSerializationHolder 和从中派生的类型(例如 System
举报原因:
原因补充:

(最多只允许输入30个字)