.NET Remoting,将对象传递给方法

时间:2012-02-13 21:12:27

标签: c# .net remoting serializable

我正在编写.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();

3 个答案:

答案 0 :(得分:4)

“不允许在此安全级别反序列化。”是重要的部分。

请参阅以下内容以获取答案

http://www.codeproject.com/Articles/4363/NET-Remoting-in-Simple-English-Really-it-s-that-s

在客户端和服务器上设置以下内容:

typeFilterLevel =格式化程序标记中的“完整”

答案 1 :(得分:2)

实际上,.NET远程处理是一种过时的技术。你应该看一下WCF。

关于你的实际问题: 您可能在信任级别太低的情况下运行应用程序 Users类应该是可序列化的,但是,如果它不包含应在服务器上运行的任何方法,则它不应来自MarshalByRefObject

答案 2 :(得分:2)

确保服务器和客户端配置都将typeFilterLevel属性设置为Full

或让您的User班级实施ISerializable

MSDN Documentation on .NET Remoting Serialization Security.