Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET远程处理,将对象传递到方法_C#_.net_Remoting_Serializable - Fatal编程技术网

C# .NET远程处理,将对象传递到方法

C# .NET远程处理,将对象传递到方法,c#,.net,remoting,serializable,C#,.net,Remoting,Serializable,我正在编写一个.NET远程处理应用程序。我的dll、服务器和客户端都工作正常。但是,当我尝试更改方法调用以获取对象参数而不是简单类型(如int)时,它会抱怨此错误 键入System.Runtime.Remoting.ObjRef及其类型(例如 不允许反序列化System.Runtime.Remoting.ObjRef) 在这个安全级别 方法是这样的 public List<Orders> GetOrders(int UserID) { //Works public List<

我正在编写一个.NET远程处理应用程序。我的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 {
这是我的服务器

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();

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

关于你的实际问题: 您可能在信任级别过低的情况下运行应用程序。

Users
类应该是可序列化的,但是,如果它不包含任何应该在服务器上运行的方法,那么它不应该派生自
MarshalByRefObject
确保服务器和客户端配置都将typeFilterLevel属性设置为
Full

或者让您的
User
类实现
ISerializable

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

请参见下面的答案

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


格式化程序标记中的typeFilterLevel=“Full”您是否尝试过从用户类中删除
MarshalByRefObject
?我还没有完全尝试过,请允许我返回并确保在删除MarshalByRefObject时它没有帮助,谢谢!因为你是第一个发布解决方案L.B的人,如果你创建了一个答案而不是一条评论,我会给你一点信任。谢谢,知道你解决了你的问题就足够了。可以说,远程处理仍然是在同一过程中在应用域之间进行对话的一种用法。只是说,我还没有看过WCF,用户类也没有包含继承MarshallByRefObject所需的任何调用。我试图采用简单的方法,创建一个可用于服务器和客户端应用程序的DLL,而不是创建多个DLL。使用过时技术的实际问题是,很少有人记住它。我几乎不记得我以前见过这个错误,但不记得如何修复它。我也老了。哈哈,好吧,我很年轻,想要拥抱最新最棒的,所以我可能应该看看WCF并弄清楚它。另外,我不想在我的新应用程序中遇到重大问题。所以谢谢你的提醒!如果我不是通过一个配置文件来设置它,我该如何执行呢?答案是:提供的链接断开了。无论何时我实现它,新的方法都是可以的,当该方法试图命中DB时,它会给我以下错误<代码>此远程处理代理没有通道接收器,这意味着服务器没有正在侦听的已注册服务器通道,或者此应用程序没有合适的客户端通道与服务器对话。更具体地说,每当它尝试访问User.UserID属性时,它都会抛出此异常。好吧,我很困惑。这是否意味着我需要在客户端计算机上创建与服务器相同的通道?是的,您的服务器和客户端都需要创建通道。Alan,我如何设置客户端以使typeFilterLevel满。我的客户就是这样产生的<代码>IChannel通道=新的TcpClientChannel();ChannelServices.RegisterChannel(channel,false);(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();