8

I am writing a .NET Remoting application. I have my dll, server, and client all working correctly. However, when I try to change my method call to take an object parameter instead of a simple type like an int, it complains with this error.

Type System.Runtime.Remoting.ObjRef and the types from it (such as System.Runtime.Remoting.ObjRef) are not permitted to be deserialized at this security level.

The method is something like this.

public List<Orders> GetOrders(int UserID) { //Works

public List<Orders> GetOrders(Users user) { // Doesnt Work

[Serializable]
public class Users : MarshalByRefObject {

Now I have made the User class also, [Serializable] and given it MarshalByRefObject inheritance. Could this be my problem? I have tried removing [Serializable] from the User class and it complains cause it cant interpret it.

EDIT Ok, here is my client method.

IChannel channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel, false);
CustomType Server = (CustomType)Activator.GetObject(typeof(CustomType), "tcp://localhost:9934/CustomType");

Here is my server.

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();
John Saunders
  • 160,644
  • 26
  • 247
  • 397
Steven Combs
  • 1,890
  • 6
  • 29
  • 54

3 Answers3

4

"are not permitted to be deserialized at this security level." is the significant part.

See the following for the answer

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

Set the following on both client and server:

typeFilterLevel="Full" in the Formatter tag

Chriseyre2000
  • 2,053
  • 1
  • 15
  • 28
2

Ensure both the server and client configuration set the typeFilterLevel property to Full

or have your User class implement ISerializable

MSDN Documentation on .NET Remoting Serialization Security.

Alan
  • 45,915
  • 17
  • 113
  • 134
  • Ok whenever I implement this, it gives me the following error when the method tries to hit the DB. `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.` – Steven Combs Feb 13 '12 at 21:45
  • Let me be more specific, whenever it tries to access the User.UserID property it throws this exception. – Steven Combs Feb 13 '12 at 21:47
  • Ok so I am confused. Does this mean I need to create the same channel on the client machine as the server? – Steven Combs Feb 13 '12 at 22:00
  • Yes, both your server, and client need to create the channel. – Alan Feb 13 '12 at 22:12
  • Alan, how do I set the client so that the typeFilterLevel is Full. My Client was created like so. `IChannel channel = new TcpClientChannel(); ChannelServices.RegisterChannel(channel, false); (CustomType)Activator.GetObject(typeof(CustomType), "tcp://localhost:9934/CustomType");` – Steven Combs Feb 13 '12 at 22:12
  • Ok unfortunately what I had done is when I copied over my classes from my application I had applied [Serializable] and MarshalByRefObject to all of them. I just went through and removed all of the MarshalByRefObject inheritance except off of the Orders class and I was able to pass the object successfully. – Steven Combs Feb 13 '12 at 22:26
1

Actually, .NET remoting is an obsolete technology. You should take a look at WCF instead.

Regarding your actual problem: Your probably running your application in a trust-level that is too low.
The Users class should be serializable, but, if it does not contain any methods that should run at the server, it should not derive from MarshalByRefObject

Frederik Gheysels
  • 56,135
  • 11
  • 101
  • 154
  • 12
    arguably, remoting still serves a usage for talking between AppDomains in the same process. Just sayin' – Marc Gravell Feb 13 '12 at 21:23
  • I havent looked at WCF yet, and the User class doesnt hold any necessary calls that would need to inherit MarshalByRefObject. I was trying to go the simple route and create a single DLL that could be utilized for the Server and Client Application instead of creating multiple DLL's. – Steven Combs Feb 13 '12 at 21:41
  • The practical problem with using an obsolete technology is that there are fewer people who remember it. I just barely remembered that I had seen this error before, but not how to fix it. And I'm _old_. – John Saunders Feb 13 '12 at 22:42
  • Lol ok well, I am young and wanting to embrace the latest and greatest so I should probably look into WCF and figure it out. Also, I dont want to run into major issues with my new app. So thanks for the heads up on this! – Steven Combs Feb 13 '12 at 22:48