C# 通过ASP.NET中的“System.Diagnostics.Process”在路径中执行程序

C# 通过ASP.NET中的“System.Diagnostics.Process”在路径中执行程序,c#,asp.net,C#,Asp.net,我在路径中有一个程序(在命令行中,我可以执行program name,并按预期运行)。这是在系统路径环境变量中(因此我相信所有用户都应该能够以这种方式访问此程序) 但是,当我仅使用文件名设置文件名(即,使用process.StartInfo.filename=“program name”)时,我的ASP.NET应用程序无法执行此应用程序。它说它找不到文件。如果我使用完整路径(即使用process.StartInfo.FileName=“C:/Program Files/Something/Pro

我在路径中有一个程序(在命令行中,我可以执行
program name
,并按预期运行)。这是在系统路径环境变量中(因此我相信所有用户都应该能够以这种方式访问此程序)

但是,当我仅使用文件名设置文件名(即,使用
process.StartInfo.filename=“program name”
)时,我的ASP.NET应用程序无法执行此应用程序。它说它找不到文件。如果我使用完整路径(即使用
process.StartInfo.FileName=“C:/Program Files/Something/Program name”
),它就可以工作


我测试了一个Windows窗体应用程序,它没有这个问题(也就是说,这两种方法都适用)。那么ASP.NET有什么不同之处呢?是否有任何方法可以避免必须指定完整路径?我希望用户在路径中有此程序,并且不希望让他们指定位置(这也是一项更大的工作)。

为什么首先要从Asp.net应用程序运行进程。Asp.net是服务器/客户端技术,因此运行进程将在服务器端运行,而不是在客户端运行。如果要将进程托管在IIS服务器上,客户端本身将存在安全问题。您需要授予在服务器上调用进程的特殊权限

第二,考虑到上面的Asp.net不会知道服务器机器的本地配置,包括环境变量,除非您明确要求,这意味着您可以通过代码手动实现。您只需在Path变量中搜索要启动的Exe

这里的片段将为您提供必要的帮助

public static string FindExePath(string exe)
{
    exe = Environment.ExpandEnvironmentVariables(exe);
    if (!File.Exists(exe))
    {
        if (Path.GetDirectoryName(exe) == String.Empty)
        {
            foreach (string test in (Environment.GetEnvironmentVariable("PATH") ?? "").Split(';'))
            {
                string path = test.Trim();
                if (!String.IsNullOrEmpty(path) && File.Exists(path = Path.Combine(path, exe)))
                    return Path.GetFullPath(path);
            }
        }
        throw new FileNotFoundException(new FileNotFoundException().Message, exe);
    }
    return Path.GetFullPath(exe);
}

确实找到了系统路径中的程序。但是更新路径的方式有点奇怪。仅重新启动IIS服务器是不够的。我必须重新启动物理机器才能识别新路径


另一个人关于需要“调用流程的特殊权限”的评论似乎不正确。另外,ASP.NET在默认情况下似乎当然知道环境变量(为了简单起见,我使用了系统路径,但由于您可以作为特定用户运行IIS服务器,因此您可能也可以使用它们的环境变量)。

运行本地程序的理由很多。在我的例子中,我正在运行FFmpeg对通过该服务器传输的录制视频执行转换。其他用途可能包括运行编译器(我想象像IDEone这样的服务)或其他类型的转换软件(有许多文件转换站点,它们都在服务器端进行转换)。@Mike是的,编程中没有任何限制,但有一些做法可以以正确的方式进行操作。如果Asp.net应用程序启动了一个进程,但该进程没有正确终止,或者该应用程序启动了多个进程,那么该怎么办?但您将如何跟踪(监视)所有进程?在我看来,Asp.net应用程序应该只通过服务于它的客户端来达到它的目的。对于服务器端处理,您可以使用WCF服务。始终保持可伸缩性选项的开放性。另外,当我使用
Environment.GetEnvironmentVariable(“PATH”)
打印ASP.NET时,该路径在ASP.NET中似乎过时了。打印的值对于所讨论的二进制文件具有不同的路径(它位于网络驱动器上,我认为这可能是导致此问题的原因)。我不知道为什么它会过时。即使在重新启动后,它仍然存在。