以编程方式从命令提示符启动节点js脚本

时间:2013-03-12 13:09:37

标签: c# .net node.js azure processstartinfo

我的web角色中有一个运行Socket.io实现的节点js脚本。我能找到如何启动节点js脚本的唯一方法是在命令提示符下运行它,所以我在web角色中创建了一个后台任务,它在命令提示符下运行脚本。

我为节点js文件,cmd.exe和节点模块文件设置了“Copy To Output Directory”的属性为“Copy If newer”,并且它们是在bin文件夹中生成的。如果我手动启动bin文件夹中的cmd.exe并运行命令“node App.js”,它可以工作,socket.io正在侦听的端口正在运行。但是当我以编程方式运行命令时,它不起作用。

它没有抛出任何错误所以我不知道它是否在我的代码中的问题或我们不能像这样启动节点js脚本。有没有办法找出命令是否正确执行?因为进程启动时没有打开cmd提示窗口。非常感谢任何指导,建议或想法。感谢

public class BackgroundThread
{
    public static void Start()
    {
        var appRoot = Path.Combine(Environment.GetEnvironmentVariable("RoleRoot") + @"\", @"approot");

        ProcessStartInfo psi = new ProcessStartInfo();
        psi.CreateNoWindow = false;
        psi.FileName = Path.Combine(appRoot, "bin", "cmd.exe");
        psi.Arguments = "node app.js";
        psi.UseShellExecute = false;
        psi.WorkingDirectory = Path.Combine(appRoot, "bin");


        try
        {
            Process p = Process.Start(psi);

        }
        catch (Win32Exception ex)
        {
            Console.WriteLine(ex.ToString());
            Console.WriteLine(ex.StackTrace);
            Console.WriteLine(ex.Source);
            Console.WriteLine(ex.ErrorCode);
        }       
    }

}

编辑:

原来iisnode可以处理所有事情,我只需要在web.config中添加重写代码。从示例azure节点js应用程序http://www.windowsazure.com/en-us/develop/nodejs/tutorials/getting-started/我得到了这个重写代码

<rewrite>
  <rules>
    <clear />
    <rule name="app" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
      <match url="iisnode.+" negate="true" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
      <action type="Rewrite" url="App.js" />
    </rule>
  </rules>
</rewrite>

它自动启动App.js,但它将我的所有视图重定向到App.js脚本。我想这与我上面的重写代码有关。我应该做些什么改变才能让App.js在启动时运行并且仍能访问我的其他html视图?

由于

2 个答案:

答案 0 :(得分:0)

在Web角色中运行node.js的最佳方法是使用iisnode - 这是一个iis http模块,它将iis请求重定向到node.exe进程,允许您使用node.js应用程序进行iis进程管理。

您可以使用windows azure powershell或azure网站轻松完成此操作。有关详细信息,请参阅http://www.windowsazure.com/en-us/develop/nodejs/tutorials/getting-started/

答案 1 :(得分:0)

执行此操作的一种方法是将所有静态内容放在特定文件夹中,并添加重写规则以绕过重定向到app.js

`                                                                    

                <!-- All other URLs are mapped to the Node.js application entry point -->
                <rule name="DynamicContent">
                     <conditions>
                          <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
                     </conditions>
                     <action type="Rewrite" url="app.js"/>
                </rule>
`