.NET Remoting, передача объектов в методы - PullRequest
7 голосов
/ 14 февраля 2012

Я пишу приложение .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. Может ли это быть моей проблемой? Я попытался удалить [Serializable] из класса User, и он жалуется, потому что не может его интерпретировать.

EDIT Хорошо, вот мой метод клиента.

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 ]

4 голосов
/ 14 февраля 2012

«запрещается десериализация на этом уровне безопасности». является значительной частью.

См. Следующий ответ

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

Установите следующее на клиенте и сервере:

typeFilterLevel = "Full" в теге Formatter

2 голосов
/ 14 февраля 2012

Убедитесь, что в конфигурации сервера и клиента для свойства typeFilterLevel установлено значение Full

или используйте ваше User классное приспособление ISerializable

Документация MSDN по безопасности сериализации .NET Remoting.

2 голосов
/ 14 февраля 2012

На самом деле .NET remoting - устаревшая технология. Вместо этого вам стоит взглянуть на WCF.

Относительно вашей актуальной проблемы: Возможно, ваше приложение работает на слишком низком уровне доверия.
Класс Users должен быть сериализуемым, но, если он не содержит методов, которые должны выполняться на сервере, он не должен быть производным от MarshalByRefObject

...