IPC无法找到指定的文件

时间:2014-05-21 17:31:24

标签: c# .net-4.0 ipc remoting

使用IPC over本地TCP从客户端到服务器线程进行通信。连接本身似乎没有丢失任何错误,但每次我尝试进行其中一个相关的调用时,我收到此消息:

System.Runtime.Remoting.RemotingException: Could not connect to an IPC Port: The System cannot Find the file specified

我想弄清楚的是为什么。因为这个WAS工作正常,直到我将有问题的项目(是的,两者)从.NET 3.5转换到.NET 4.0。

收听代码

private void ThreadListen()
{
  _listenerThread = new Thread(Listen) {Name = "Listener Thread", Priority = ThreadPriority.AboveNormal};
  _listenerThread.Start();
}

private void Listen()
{
  _listener = new Listener(this);

  LifetimeServices.LeaseTime = TimeSpan.FromDays(365);      

  IDictionary props = new Hashtable();
  props["port"] = 63726;
  props["name"] = "AGENT";

  TcpChannel channel = new TcpChannel(props, null, null);
  ChannelServices.RegisterChannel(channel, false);

  RemotingServices.Marshal(_listener, "Agent");
  Logger.WriteLog(new LogMessage(MethodBase.GetCurrentMethod().Name, "Now Listening for commands..."));
  LogEvent("Now Listening for commands...");
}

选定的客户代码

private void InitializeAgent()
{
  try
  {
     _agentController =
     (IAgent)RemotingServices.Connect(typeof(IAgent), IPC_URL);
     //Note: IPC_URL was originally "ipc://AGENT/AGENT"  
     //      It has been changed to read "tcp://localhost:63726/Agent"
     SetAgentPid();
  }
  catch (Exception ex)
  {
    HandleError("Unable to initialize the connected agent.", 3850244, ex);
  }
}

//This is the method that throws the error
public override void LoadTimer()
{
  // first check to see if we have already set the agent process id and set it if not
  if (_agentPid < 0) 
  {
    SetAgentPid();
  }

  try
  {
    TryStart();
    var tries = 0;
    while (tries < RUNCHECK_TRYCOUNT)
    {
      try
      {
        _agentController.ReloadSettings();//<---Error occurs here
        return;
      } catch (RemotingException)
      {
        Thread.Sleep(2000);
        tries++;
        if (tries == RUNCHECK_TRYCOUNT)
        throw;
      }
    }
  }
  catch (Exception ex)
  {
    HandleError("Unable to reload the timer for the connected agent.", 3850243, ex);
  }
}

如果你需要看到我还没有看到的东西,请问,我在这里几乎是盲目的。

编辑:我认为问题是IPC_URL字符串。它目前设置为"ipc://AGENT/AGENT"。问题是,我不知道它来自哪里,为什么它之前有效,或者什么可能阻止它现在工作。

更新

我能够通过更改IPC_URL字符串使IPC调用正常工作,但我仍然不了解为什么我的工作。或者更确切地说,为什么原始代码停止工作,我需要首先更改它。

我现在使用的字符串是"tcp://localhost:63726/Agent"

任何人都可以告诉我,不是为什么新字符串有效,我知道...但为什么原始字符串之前工作以及为什么将项目目标更新到.NET 4.0会破坏它?

0 个答案:

没有答案