2012-05-18 44 views
3

我有一个遗留应用程序,我试图在Azure工作下运行。该应用程序使用相当常见的模式通过创建匿名管道来启动子进程,将stdout重定向到管道,产生子进程,然后使用管道进行通信。管道读取在Azure上失败

为了让它在Azure下运行,我对启动整个过程的dll进行了P/Invoke调用。

所有这些在Azure之外都可以正常工作,但即使在模拟器下运行时也会失败。

在Azure下运行时,procs无法通过管道进行通信。特别是,由父级读取管道句柄的调用失败(超时)。

+0

您的本地代码是否为x64编译? – ildjarn

+0

是的,我能够浏览模拟器下的代码,并且它只是在通话中阻止阅读。 – AdamC

回答

2

我终于明白,问题是因为遗留代码是复制stdout句柄传递给子进程。

在Azure下运行时,STDOUT的GetStdHandle返回0x0。这基本上意味着,“没有错误,但你没有STDOUT”。显然,你需要检查0x0和INVALID_HANDLE。

创建句柄,在启动孩子之前将它们设置在STARTUPINFO上,而不是复制现有的句柄,从而修复了一切。

-1

我有两个建议如下:

  1. 请问如果你是使用.NET 4编译你的Worker角色?使用.net 4在使用网络管道绑定应用程序时遇到了一些问题,特别是当您使用P/Invoking时,请将您的应用程序属性设置为.net 3.5配置文件。
  2. 使用SYSTEM上下文从启动任务启动此传统进程,并将此应用程序EXE设置为CSDEF中的ProgramEntryPoint,以便它可以直接启动。你也使用任何IP /端口与此应用程序?是的,你必须在你的角色onStart()中编写一些代码才能正确绑定。

让我知道你的结果是什么。

+0

感谢-1。感谢您提供一些意见,以便我能理解建议的问题。 – AvkashChauhan

+1

我没有倒下,但我怀疑某人所做的原因是因为你的回答只是由问题组成,这些问题作为评论会更合适。 – ildjarn

+0

@Adam,今天我与Azure支持工程师一起解决了您的问题,并能够获得一些帮助。还有其他一些方法可以解决这个问题,我将在稍后添加更多信息。 – AvkashChauhan