Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / .NET Remoting / 15 сообщений из 15, страница 1 из 1
18.12.2012, 09:33
    #38082981
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
Здравствуйте. Помогите-объясните пожалуйста. Делаю remoting приложение. Все вроде бы работает нормально, но когда я вызываю метод у удаленного объекта который возвращает объект или интерфейс, то возникает ошибка "Недопустимый тип возвращаемого аргумента". Разъясните пожалуйста, где мое упущение. Заранее огромное спасибо!

Сервер:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
    class Server
    {
        TcpChannel tcpChannel = null;
        
        public Server()
        {

                Console.WriteLine("Запуск сервера...");

                tcpChannel = new TcpChannel(9998);
                ChannelServices.RegisterChannel(tcpChannel, false);
                
                RemotingConfiguration.RegisterWellKnownServiceType(typeof(SimpleClass),"SimpleClass", WellKnownObjectMode.Singleton);
                RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyClass), "MyClass", WellKnownObjectMode.Singleton);

                Console.WriteLine("Сервер запущен...");
                System.Console.WriteLine("Для завершения нажмите ENTER...");
                System.Console.ReadLine();

        } 
    }

   ...................................................

    public interface ISimpleClass
    {
        void sayHello();
        IMyClass getMyClass();
    }

    public interface IMyClass
    {
        void sayPrivet();
    }

    class SimpleClass : MarshalByRefObject, ISimpleClass
    {
        public void sayHello()
        {
            System.Console.WriteLine("HELLO!");
        }

        public IMyClass getMyClass()
        {
            return new MyClass();
        }
    }

    public class MyClass : MarshalByRefObject, IMyClass
    {
        public void sayPrivet()
        {
            System.Console.WriteLine("Привет!");
        }
    }



Клиент:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
    public interface ISimpleClass
    {
        void sayHello();
        IMyClass getMyClass();
    }

    public interface IMyClass
    {
        void sayPrivet();
    }

    public class SimpleCOMClass:
    {
        private ISimpleClass remoteObject = null;

        public SimpleCOMClass()
        {
            TcpChannel tcpChannel = new TcpChannel();
            ChannelServices.RegisterChannel(tcpChannel, false);
            remoteObject = (ISimpleClass)Activator.GetObject(typeof(ISimpleClass), "tcp://192.168.206.1:9998/SimpleClass");
        }

        public void sayHello()
        {
            remoteObject.sayHello(); //!!!Работает замечательно!!!
        }

        public IMyClass getMyClass()
        {
            return remoteObject.getMyClass(); //!!!ТУТ ОШИБКА!!!!
        }
    }

...
Рейтинг: 0 / 0
18.12.2012, 10:46
    #38083070
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
GorloPavel,

немного оффтоп: вам точно нужен именно remoting?
...
Рейтинг: 0 / 0
18.12.2012, 13:04
    #38083330
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
netivan,

Да. А есть ещё что-то приемлимое?
...
Рейтинг: 0 / 0
18.12.2012, 13:09
    #38083340
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
GorloPavel,

может MyClass нужен [Serializable] атрибут (или поддержка ISerializable)?
...
Рейтинг: 0 / 0
18.12.2012, 13:11
    #38083343
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
GorloPavelА есть ещё что-то приемлимое?
смотря для каких целей... WCF проще, понятней, практичней...
...
Рейтинг: 0 / 0
18.12.2012, 13:12
    #38083346
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
LRGorloPavelА есть ещё что-то приемлимое?
смотря для каких целей... WCF проще, понятней, практичней...

кроме того майкрософт давно писала, что ремоутинг устаревшая технология.
...
Рейтинг: 0 / 0
18.12.2012, 15:06
    #38083598
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
LR,

Ок.. WCF. Проблема та же... Помогите пожалуйста.

Сервер:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
    
    [ServiceContract]
    public interface IServerClass
    {
        [OperationContract]
        void sayHello();
        [OperationContract]
        IMyClass getClass();
    }

    class ServerClass:IServerClass
    {
        public void sayHello()
        {
            System.Console.WriteLine("Hello!");
        }

        public IMyClass getClass()
        {
            return new MyClass();
        }
    }

    public interface IMyClass
    {
        void sayPrivet();
    }

    public class MyClass:IMyClass
    {
        public string temp = null;

        public void sayPrivet()
        {
            System.Console.WriteLine("Привет!");
        }
    }

    ...........................................
    
    System.Console.WriteLine("Запуск сервера...");
    ServiceHost svcHost = new ServiceHost(typeof(ServerClass), new Uri[] { });
    svcHost.AddServiceEndpoint(typeof(IServerClass), new NetTcpBinding(), "net.tcp://localhost:9000/SimpleService");
    svcHost.Open();
    System.Console.WriteLine("Сервер запущен...");
    System.Console.ReadKey();
    svcHost.Close();



Клиент:
Код: c#
1.
2.
3.
4.
5.
6.
IServerClass remoteObject = null;
IMyClass remoteClass = null;

ChannelFactory<IServerClass> factory = new ChannelFactory<IServerClass>(new NetTcpBinding());
remoteObject = factory.CreateChannel(new EndpointAddress("net.tcp://localhost:9000/SimpleService"));
remoteClass = remoteObject.getClass(); //Вылет Exeption с формулировкой "Обрыв соединения и т.д..."

...
Рейтинг: 0 / 0
18.12.2012, 15:52
    #38083714
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
Вообщем получается нельзя получить ссылку на объект который находится внутри ServiceHost класса?
...
Рейтинг: 0 / 0
18.12.2012, 16:02
    #38083735
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
GorloPavelВообщем получается нельзя получить ссылку на объект который находится внутри ServiceHost класса?
все должно прилетать сериализованным, какие там объекты могут быть.

Посмотрите какие прокси создаются на клиенте, если вы используете сервис референсе, чудес нет...


Кстати, есть такой подфорум

http://www.sql.ru/forum/actualtopics.aspx?bid=71
...
Рейтинг: 0 / 0
18.12.2012, 16:44
    #38083835
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
WinnipuhGorloPavelВообщем получается нельзя получить ссылку на объект который находится внутри ServiceHost класса?
все должно прилетать сериализованным, какие там объекты могут быть.
+1

GorloPavel,
[OperationContract] IMyClass getClass() означает что "IMyClass" должен быть DataContract, сериализуемым(на сервере)/десериализуемым(на клиенте), т.е., не интерфейсом... (другими словами, WCF это больше "обмен данными" чем "управление удаленным объектом")
...
Рейтинг: 0 / 0
18.12.2012, 20:10
    #38084140
GFX
GFX
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
GorloPavelВообщем получается нельзя получить ссылку на объект который находится внутри ServiceHost класса?
укажите для интерфейса IMyClass
вот такой атрибут
Код: c#
1.
[ServiceKnownType(typeof(MyClass))]
...
Рейтинг: 0 / 0
19.12.2012, 03:32
    #38084402
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
GFX,

Спасибо. Но не сработало. Вот что в итоге я сделал, но все равно не работает.

Сервер:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
    [ServiceContract]
    public interface IServerClass
    {
        [OperationContract]
        IMyClass getMyClass();
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class ServerClass:IServerClass
    {
        MyClass myClass = null;

        public ServerClass()
        {
            myClass = new MyClass();
        }

        public IMyClass getMyClass()
        {
            return myClass;
        }
    }

    [ServiceKnownType(typeof(MyClass))]
    public interface IMyClass
    {
        void sayHello();
    }

    public class MyClass:IMyClass
    {
        public void sayHello()
        {
            System.Console.WriteLine("Привет!");
        }
    }

................................

System.Console.WriteLine("Запуск сервера...");
ServiceHost svcHost = new ServiceHost(typeof(ServerClass), new Uri[] { });
svcHost.AddServiceEndpoint(typeof(IServerClass), new NetTcpBinding(), "net.tcp://localhost:9000/ServerClass");

svcHost.Open();
System.Console.WriteLine("Сервер запущен...");
System.Console.ReadKey();
svcHost.Close();



Клиент:
Код: c#
1.
2.
3.
ChannelFactory<IServerClass> factory = new ChannelFactory<IServerClass>(new NetTcpBinding());
remoteObject = factory.CreateChannel(new EndpointAddress("net.tcp://localhost:9000/ServerClass"));
remoteObject.getMyClass().sayHello();



В WCF и .NET Remoting нельзя передавать ссылку на удаленный объект?!
...
Рейтинг: 0 / 0
19.12.2012, 03:34
    #38084403
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
Уточню. Я хочу чтобы System.Console.WriteLine("Привет!"); срабатывало на сервере. А клиент получал только ссылку на объект. Это возможно!?
...
Рейтинг: 0 / 0
19.12.2012, 11:51
    #38084718
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
GorloPavel,

очень странная задача у вас, честно
может так надо:
Код: c#
1.
2.
3.
4.
public string sayHello()
        {
           return ("Привет!");
        }


а на клиенте:
Код: c#
1.
2.
var result = factory.Execute(....)
Console.WriteLine(result)
...
Рейтинг: 0 / 0
19.12.2012, 12:32
    #38084835
tAZAR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.NET Remoting
"Ссылка на удаленный объект" это уже сам по себе сервис в WCF...

В remoting же это наследник MarshalByRefObject. Его можно вернуть из метода, на клиент будет передан прокси для вызова объекта, созданного на сервере.

Это если я правильно понял, чего вы хотите.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / .NET Remoting / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]