Winsean

Remoting之序列化问题

    最近一直在做工作流管理系统的开发,但前几天遇到了棘手的问题,直到昨天零晨一点多终于找到了问题的原因与解决方法,这种柳岸花明的感觉真是让人愉悦(即使开发进度拖了几天)。
    场景
    该场景是我根据我项目的使用情况杜撰出的类似情况,就是客户端向远程服务器发送要更新的员工信息来让服务器更新员工信息。
    其中类图如下,该模型主要有3部分组成:包含Client(用于加载Remoting客户端)类的客户端应用Clert,包含Server(用于加载Remoting服务器)类的服务器端应用Server以及包含CustomerInfo和HRHelper类的强名称程序集。

    下图是演示客户端获取指定ID的客户信息并显示的执行过程:

    第一步:Client创建HRHelper远程对象的实例;
    第二步:Clent调用HRHelper实例的ProvdeCustomer()方法,向其传送CustomerInfo类型的CustomerId的客户ID信息,让HRHelper更新该客户的ID信息,ProvdeCustomer方法返回customerInfo;
    第三步:Client调用HRHelper实例的ShowCustormer显示customerInfo信息。

    问题
    在执行ProvdeCustomer方法时,会抛出异常:SerializationException,异常信息:由于安全限制,无法访问类型 CustomerInfo(英文信息为:Because of security restrictions, the type cannot be accessed 
    解决问题的过程
    首先我在调试状态下发现SerializationException的内部异常信息为System.Security.SecurityException,因此我怀疑是没有权限进行序列化。但我的客户端和服务器端都是WinForm驻留程序,且在Administrator用户下运行,因此最有可能出现问题的地方是CAS,应该是程序集没有序列化权限,因此我把三个程序集都通过自定义代码组授予了序列化权限,但问题依旧。
    后来,我把Remoting的强名称去掉了,我替就解决了。但是因为我的系统使用了COM+,因此必须使用轻名称。接着继续查找原因,包括到Google搜索信息,终于找到了问题的真正原因,在MSDN的AllowPartiallyTrustedCallersAttribute 中有准确的描述:在默认情况下,如果一个具有强名称的程序集未在程序集级别上显式应用此属性来允许部分受信任的代码使用它,则只有被安全策略授予完全信任的其他程序集才可以调用此程序集。

    解决方案
    方案一:在CAS中给Clert程序集授予FullTrust权限集;
    方案二:在Remoting程序集应用AllowPartiallyTrustedCallersAttribute 属性。   

posted on 2006-08-11 11:20  winsea  阅读(703)  评论(1)    收藏  举报

导航