使用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会破坏它?