.NET Remoting,将对象传递给方法
Posted
技术标签:
【中文标题】.NET Remoting,将对象传递给方法【英文标题】:.NET Remoting, passing objects into methods 【发布时间】:2012-03-05 07:15:43 【问题描述】:我正在编写一个 .NET Remoting 应用程序。我的 dll、服务器和客户端都正常工作。但是,当我尝试更改我的方法调用以采用对象参数而不是像 int 这样的简单类型时,它会抱怨此错误。
键入 System.Runtime.Remoting.ObjRef 及其类型(例如 System.Runtime.Remoting.ObjRef) 不允许反序列化 在这个安全级别。
方法是这样的。
public List<Orders> GetOrders(int UserID) //Works
public List<Orders> GetOrders(Users user) // Doesnt Work
[Serializable]
public class Users : MarshalByRefObject
现在我也创建了 User 类,[Serializable] 并赋予它 MarshalByRefObject 继承。这可能是我的问题吗?我已经尝试从 User 类中删除 [Serializable] 并且它抱怨导致它无法解释它。
编辑 好的,这是我的客户端方法。
IChannel channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel, false);
CustomType Server = (CustomType)Activator.GetObject(typeof(CustomType), "tcp://localhost:9934/CustomType");
这是我的服务器。
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;
IDictionary props = new Hashtable();
props["port"] = 9934;
TcpChannel channel = new TcpChannel(props, null, provider);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(CustomType), "CustomType", WellKnownObjectMode.Singleton);
Console.WriteLine("Server is initialized");
Console.ReadLine();
【问题讨论】:
您是否尝试过从 Users 类中删除MarshalByRefObject
?
我还没有完全试过,让我回去确认一下
当我删除 MarshalByRefObject 时它没有帮助,谢谢!
由于您是第一个发布解决方案 L.B 的人,如果您创建答案而不是评论,我会给予您信任。
谢谢,知道您解决了问题就足够了。
【参考方案1】:
“不允许在此安全级别反序列化。”是重要的部分。
答案见下文
http://www.codeproject.com/Articles/4363/NET-Remoting-in-Simple-English-Really-it-s-that-s
在客户端和服务器上设置以下内容:
格式化程序标签中的typeFilterLevel="Full"
【讨论】:
如果我没有通过配置文件进行设置,我该如何执行? 答案在这里:alexthissen.nl/blogs/main/archive/2007/12/23/… 提供的链接已损坏。新的是alexthissen.wordpress.com/2007/12/23/…【参考方案2】:确保服务器和客户端配置都将 typeFilterLevel 属性设置为 Full
或者让你的User
类实现ISerializable
MSDN Documentation on .NET Remoting Serialization Security.
【讨论】:
好的,每当我实现它时,当方法尝试访问数据库时,它会给我以下错误。This remoting proxy has no channel sink which means either the server has no registered server channels that are listening, or this application has no suitable client channel to talk to the server.
让我更具体一点,每当它尝试访问 User.UserID 属性时,都会引发此异常。
好吧,我很困惑。这是否意味着我需要在客户端计算机上创建与服务器相同的通道?
是的,你的服务器和客户端都需要创建通道。
艾伦,我如何设置客户端以使 typeFilterLevel 为 Full。我的客户就是这样创建的。 IChannel channel = new TcpClientChannel(); ChannelServices.RegisterChannel(channel, false); (CustomType)Activator.GetObject(typeof(CustomType), "tcp://localhost:9934/CustomType");
【参考方案3】:
实际上,.NET 远程处理是一种过时的技术。你应该看看 WCF。
关于您的实际问题:
您可能以太低的信任级别运行您的应用程序。Users
类应该是可序列化的,但是,如果它不包含任何应该在服务器上运行的方法,则它不应派生自 MarshalByRefObject
【讨论】:
可以说,远程处理仍然可以用于在同一进程中的 AppDomain 之间进行对话。只是说' 我还没有看过 WCF,并且 User 类不包含任何需要继承 MarshalByRefObject 的必要调用。我试图走简单的路线并创建一个可用于服务器和客户端应用程序的 DLL,而不是创建多个 DLL。 使用过时技术的实际问题是记住它的人越来越少。我只是几乎不记得我以前见过这个错误,但不记得如何修复它。而且我老了。 大声笑好吧,我还年轻,想拥抱最新最好的,所以我可能应该研究一下 WCF 并弄清楚。另外,我不想在我的新应用程序中遇到重大问题。所以感谢您对此的提醒!以上是关于.NET Remoting,将对象传递给方法的主要内容,如果未能解决你的问题,请参考以下文章
如何将对象传递给 HttpClient.PostAsync 并序列化为 JSON 主体?