2013-09-25 3 views
1

У меня проблема с удалением .net (и да, это моя первая попытка использовать его, поэтому я сожалею, если это глупая проблема с простым решением) и я искал два дня и не могу найти решение моей проблемы, поэтому заранее извиняюсь, если я каким-то образом пропустил ответ..net remoting при передаче объекта сгенерированной рамки объекта

Я строй системы клиента/сервера, используя этот код:

Сервер:

public Server() { 
    DbConnector db = new DbConnector(); 

    BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider(); 
    provider.TypeFilterLevel = TypeFilterLevel.Full; 
    IDictionary props = new Hashtable(); 
    props["port"] = DbConnector.PORT; 
    TcpChannel channel = new TcpChannel(props, null, provider); 

    ChannelServices.RegisterChannel(channel, true); 
    RemotingConfiguration.RegisterWellKnownServiceType(
     typeof(DbConnector), "test", 
     WellKnownObjectMode.SingleCall); 
} 

Клиент:

public Form1() { 
    InitializeComponent(); 

    BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider(); 
    provider.TypeFilterLevel = TypeFilterLevel.Full; 
    IDictionary props = new Hashtable(); 
    props["port"] = 0; 
    props["ip"] = DbConnector.IP; 
    TcpChannel channel = new TcpChannel(props, null, provider); 

    ChannelServices.RegisterChannel(channel, true); 
    db = (DbConnector)Activator.GetObject(typeof(DbConnector), "tcp://188.x.x.x/test"); 
    InitRest(); 
} 

Всякий раз, когда я пытаюсь его локально (как с локальным, но и с WAN IP) все работает нормально, но как только я пробую его на отдельных машинах, клиент выдает исключение.

{System.Net.Sockets.SocketException (0x80004005): A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 192.168.0.100:9090 

Server stack trace: 
    ved System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) 
    ved System.Net.Sockets.Socket.Connect(EndPoint remoteEP) 
    ved System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket(EndPoint ipEndPoint) 
    ved System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket() 
    ved System.Runtime.Remoting.Channels.RemoteConnection.GetSocket() 
    ved System.Runtime.Remoting.Channels.SocketCache.GetSocket(String machinePortAndSid, Boolean openNew) 
    ved System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.SendRequestWithRetry(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream) 
    ved System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream) 
    ved System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg) 

Exception rethrown at [0]: 
    ved ECTunes.Database_Reader.Form1.InitRest() i d:\Dropbox\visual studio 2012\Projects\ECTunes\Database Communicator v0.2\Database Reader\Form1.cs:linje 69 
    ved ECTunes.Database_Reader.Form1..ctor() i d:\Dropbox\visual studio 2012\Projects\ECTunes\Database Communicator v0.2\Database Reader\Form1.cs:linje 56 
    ved ECTunes.Database_Reader.Program.Main() i d:\Dropbox\visual studio 2012\Projects\ECTunes\Database Communicator v0.2\Database Reader\Program.cs:linje 16 
    ved System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    ved System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    ved Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    ved System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    ved System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    ved System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    ved System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    ved System.Threading.ThreadHelper.ThreadStart()} 

я печатаю текст пришел, когда конструктор для DbConnector называется, и я могу видеть, что клиент связывается с сервером, но я застрял в этом.

После немного более сложного тестирования кажется, что проблема связана не с самим соединением, а с вызовом функции, которая возвращает объект из части фреймворка сущности системы, которая генерирует код. Я уже изменил классы с [Serializable] и: MarshalByRefObject, как показано ниже:

//------------------------------------------------------------------------------ 
// <auto-generated> 
// This code was generated from a template. 
// 
// Manual changes to this file may cause unexpected behavior in your application. 
// Manual changes to this file will be overwritten if the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

namespace Database 
{ 
    using System; 
    using System.Collections.Generic; 

    [Serializable] 
    public partial class customer: MarshalByRefObject 
    { 
     public customer() 
     { 
      this.car = new HashSet<car>(); 
     } 

     public int customerId { get; set; } 
     public string name { get; set; } 

     public virtual ICollection<car> car { get; set; } 
    } 
} 

Тем не менее, когда клиентская программа вызывает функцию, которая возвращает «клиент» объект и пытается получить доступ к этому клиенту бросает исключение выше ,

Я предполагаю, что по мере того, как класс происходит из MarshalByRefObject, это часть обратного вызова, которая идет вверх.

Я также пытался использовать определенный порт для клиентского канала, но безрезультатно.

Надеюсь, у кого-то есть решение для этого, в конце концов, наверное, только я, у которого отсутствует ключевая часть.

ответ

0

я решить эту проблему, сделав класс-оболочку для объектов и использовать его для передачи вместо этого. Немного больше работы, но она работает. По-видимому, вы не должны отправлять объекты, созданные сгенерированными объектами, через эти каналы.

0

Я думаю, что нашел его, благодаря вам, предоставив свой образец!

ChannelServices.RegisterChannel(channel, true); 

Установите ensureSecurity к ложному

ChannelServices.RegisterChannel(channel, false); 
+0

Спасибо за ваш ответ. Я попытался это сделать, но это не изменило ситуацию. Однако я решил это сделать, создав класс-обертку для объектов и вместо этого использую это для передачи. Немного больше работы, но она работает. По-видимому, вы не должны отправлять объекты, созданные сгенерированными объектами, через эти каналы. – andidegn