2013-06-05 4 views
2

У меня есть 2 компьютера с некоторым программным обеспечением, теперь мне нужен один компьютер для выполнения метода на другом ПК, теперь я искал высокий и низкий, но не смог найти ничего о том, как это сделать. Я мог бы сделать это, написав свой собственный маленький интерфейс, который сериализует аргументы, имя метода и возвращает объекты и отправляет их по сокету, а затем десериализует выполнение этого метода с использованием отражения и возвращает объект результата через сокет. Но я хотел бы получить чье-то мнение, прежде чем начать писать то, что намного проще.Динамически вызывать метод по сокету

  • Отправить несколько аргументов (все они будут получены и отправить в качестве объекта)
  • возвращает объект
  • сериализации назад объект исключения если произошла

Я не сделал ничего в сериализации объектов и отправки их по сокету, но все ли стандартизованные объекты сериализуемы? Как List<> array[] float dateTime?

Я надеюсь, что это объяснил, если нет, извините и спросите, что не ясно.

ответ

1

Я искал в Интернете примеры и вставил несколько кода, я отправляю его здесь, если кому-то это нужно. Это грязный код, но он работает, то InvokeMethod находится на стороне клиента, а startIBC является то, что должно быть начато на каждом сервере:

[ServiceContract] 
    public interface IBlissRequest 
    { 
     [OperationContract] 
     object SystemRequest(string InstanceName, string MethodName, params object[] Parameters); 
    } 

    public class BlissRequest : IBlissRequest 
    { 
     public object SystemRequest(string InstanceName, string MethodName, params object[] Parameters) 
     { 
      return System21.BlissProcessingUnit.BPU.RequestFromIBC(InstanceName, MethodName, Parameters); 
     } 
    } 

public static object InvokeMethod(string targetIpAddress, string InstanceName, string MethodName, params object[] Parameters) 
     { 
      try 
      { 
       var ep = "net.tcp://" + targetIpAddress + ":9985/IBC"; 

       NetTcpBinding binding = new NetTcpBinding(SecurityMode.None); 

       ChannelFactory<IBlissRequest> pipeFactory = new ChannelFactory<IBlissRequest>(binding, new EndpointAddress(ep)); 

       IBlissRequest pipeProxy = pipeFactory.CreateChannel(); 

       return pipeProxy.SystemRequest(InstanceName, MethodName, Parameters); 
      } 
      catch 
      { 
       BPUConsole.WriteLine(BPUConsole.WriteSource.IBC, "Unable to execute method: '" + MethodName +"' on Instance: '"+InstanceName+"' becouse IBC is unable to connect to: "+ targetIpAddress); 
       throw new Exception("Unable to connect to: " + targetIpAddress); 
      } 
     } 

     public static void StartIBC() 
     { 
      var uri = "net.tcp://" + BlissProcessingUnit.BPUInformation.LocalIpAddresses[0] + ":9985"; 
      Console.WriteLine("Opening connection on: " + uri); 

      ServiceHost host = new ServiceHost(typeof(BlissRequest), new Uri[] { new Uri(uri) }); 

      NetTcpBinding binding = new NetTcpBinding(SecurityMode.None); 

      host.AddServiceEndpoint(typeof(IBlissRequest), binding, "IBC"); 

      host.Open(); 

      Console.WriteLine("Service is available. " + "Press <ENTER> to exit."); 

     } 
3

Создайте службу WCF и настройте WCF для работы через TCP.

Это даст вам «из коробки» большинство вещей (сериализации/десериализации, открыть/закрыть сокет)

Есть хорошие примеры here, here и хорошее чтение here

+0

Я искал примеры для этого, но я Канот найти что-нибудь я полностью понимаю, что мне нужно, так это то, что в сети есть несколько компьютеров, которые могут выполнять методы на других компьютерах, но я не нашел примеров, которые делают это по сети, которую легко читать. – Jeffnl

0

То, что вы описываете звуки например, вызов удаленной процедуры (RPC). RPC позволяет создать единый объект на сервере, с которым клиенты могут взаимодействовать, как если бы это был локальный объект (так что полностью избегайте необходимости обращаться к сокетам). Кроме того, каждый клиент может также создать свой собственный уникальный серверный объект для взаимодействия.

Полную реализацию RPC можно найти в сетевой библиотеке networkcomms.net. Следующий фрагмент кода взят из доступного примера RPC и использует объект типа MathClass, который может выполнять простые вычисления математики.

Объект существует на стороне сервера:

//Register a single object server side called "Calculator" 
RemoteProcedureCalls.Server.RegisterInstanceForPublicRemoteCall<MathClass, IMath>(new MathClass(), "Calculator"); 

На стороне клиента:

//Get a reference to the remote object named "Calculator" 
IMath calc = RemoteProcedureCalls.Client.CreateProxyToPublicNamedInstance<IMath>(connection, "Calculator", out instanceId); 
//We can now use the calculator object as if it were local 
//The following WriteLine outputs '12' where the calculation was performed on the server 
Console.WriteLine(calc.Multiply(4, 3)); 

Отказ от ответственности: Я должен добавить, что я являюсь разработчиком для этой библиотеки.

Смежные вопросы