运行 来自 Web 的全局节点应用程序 API 使用进程的应用程序
running a global node application from Web API application using process
我有一个 WEB API 应用程序,在 ASP.NET 框架 4.7 中完成,我想在 NodeJs 中使用命令行调用一个应用程序,因此,使用 System.Diagnostic.Process。
已使用
安装了 NodeJs 应用程序
npm install -g mapshaper
在开发环境中一切正常,我什至可以捕获输出,但是当我 运行 在生产服务器上时,我在标准输出中得到以下消息:
'mapshaper' is not recognized as an internal or external command,\r\noperable program or batch file.
(mapshaper是我要的nodejs应用运行)
请注意,如果我在生产服务器上直接从命令行 运行 应用程序,它会完美运行。
如果我从 API 运行 而不是 'mapshaper',命令 'DIR' 我得到目录列表,因此它有效。我也试过 运行 'node -v' 并且我正确地获得了安装的节点版本:
c:\windows\system32\inetsrv>node -v\r\nv10.16.3
这是我用来调用 cmd.exe 并将命令插入 运行 的代码:
string strOutput = "";
string path = HostingEnvironment.MapPath("~");
string fileName = "cmd.exe ";
string args = "mapshaper -h";
//args = "dir"; //IT WORKS
//args = "node -v"; //IT WORKS and I get the ver. installed as output
System.Diagnostics.Process pProcess = new System.Diagnostics.Process();
pProcess.StartInfo.FileName = fileName;
pProcess.StartInfo.UseShellExecute = false;
pProcess.StartInfo.RedirectStandardOutput = true;
pProcess.StartInfo.RedirectStandardError = true;
pProcess.StartInfo.RedirectStandardInput = true;
ConcurrentQueue<string> messages = new ConcurrentQueue<string>();
pProcess.ErrorDataReceived += (object se, DataReceivedEventArgs ar) =>
{
string data = ar.Data;
if (!string.IsNullOrWhiteSpace(data))
messages.Enqueue(data);
};
pProcess.OutputDataReceived += (object se, DataReceivedEventArgs ar) =>
{
string data = ar.Data;
if (!string.IsNullOrWhiteSpace(data))
messages.Enqueue(data);
};
pProcess.Start();
pProcess.StandardInput.WriteLine(args);
pProcess.StandardInput.Flush();
pProcess.StandardInput.Close();
pProcess.BeginErrorReadLine();
pProcess.BeginOutputReadLine();
while (!pProcess.HasExited)
{
string data = null;
if (messages.TryDequeue(out data))
strOutput+=data+"\r\n";
}
pProcess.WaitForExit(2000);
pProcess.Close();
所以在生产中只有命令 mapshaper 在上面的代码中 运行 时无法识别(如果它是从命令行手动 运行 则它可以工作)。
可能是什么原因?在服务器上执行 NodeJs 的一些权限?
请确保您在生产服务器中有运行命令npm install -g mapshaper
,npm install
不会安装开发服务器中的全局包。
还要确保路径与 /npm packages 目录链接,请 运行 在命令行中使用此脚本
path=%PATH%;%APPDATA%\npm
我有一个 WEB API 应用程序,在 ASP.NET 框架 4.7 中完成,我想在 NodeJs 中使用命令行调用一个应用程序,因此,使用 System.Diagnostic.Process。
已使用
安装了 NodeJs 应用程序npm install -g mapshaper
在开发环境中一切正常,我什至可以捕获输出,但是当我 运行 在生产服务器上时,我在标准输出中得到以下消息:
'mapshaper' is not recognized as an internal or external command,\r\noperable program or batch file.
(mapshaper是我要的nodejs应用运行)
请注意,如果我在生产服务器上直接从命令行 运行 应用程序,它会完美运行。
如果我从 API 运行 而不是 'mapshaper',命令 'DIR' 我得到目录列表,因此它有效。我也试过 运行 'node -v' 并且我正确地获得了安装的节点版本:
c:\windows\system32\inetsrv>node -v\r\nv10.16.3
这是我用来调用 cmd.exe 并将命令插入 运行 的代码:
string strOutput = "";
string path = HostingEnvironment.MapPath("~");
string fileName = "cmd.exe ";
string args = "mapshaper -h";
//args = "dir"; //IT WORKS
//args = "node -v"; //IT WORKS and I get the ver. installed as output
System.Diagnostics.Process pProcess = new System.Diagnostics.Process();
pProcess.StartInfo.FileName = fileName;
pProcess.StartInfo.UseShellExecute = false;
pProcess.StartInfo.RedirectStandardOutput = true;
pProcess.StartInfo.RedirectStandardError = true;
pProcess.StartInfo.RedirectStandardInput = true;
ConcurrentQueue<string> messages = new ConcurrentQueue<string>();
pProcess.ErrorDataReceived += (object se, DataReceivedEventArgs ar) =>
{
string data = ar.Data;
if (!string.IsNullOrWhiteSpace(data))
messages.Enqueue(data);
};
pProcess.OutputDataReceived += (object se, DataReceivedEventArgs ar) =>
{
string data = ar.Data;
if (!string.IsNullOrWhiteSpace(data))
messages.Enqueue(data);
};
pProcess.Start();
pProcess.StandardInput.WriteLine(args);
pProcess.StandardInput.Flush();
pProcess.StandardInput.Close();
pProcess.BeginErrorReadLine();
pProcess.BeginOutputReadLine();
while (!pProcess.HasExited)
{
string data = null;
if (messages.TryDequeue(out data))
strOutput+=data+"\r\n";
}
pProcess.WaitForExit(2000);
pProcess.Close();
所以在生产中只有命令 mapshaper 在上面的代码中 运行 时无法识别(如果它是从命令行手动 运行 则它可以工作)。
可能是什么原因?在服务器上执行 NodeJs 的一些权限?
请确保您在生产服务器中有运行命令npm install -g mapshaper
,npm install
不会安装开发服务器中的全局包。
还要确保路径与 /npm packages 目录链接,请 运行 在命令行中使用此脚本
path=%PATH%;%APPDATA%\npm