首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用非个性化功能从.NET Web应用程序启动流程

使用非个性化功能从.NET Web应用程序启动流程
EN

Stack Overflow用户
提问于 2016-04-27 19:59:29
回答 3查看 1K关注 0票数 2

我尝试从.exe应用程序调用.exe文件。但是我想要用户调用的文件,该文件是由网站上的windoes身份验证模拟的。

代码语言:javascript
复制
Process process = new Process();
try
{
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.FileName = ConfigData.PVDToBudgetDBexePath;
    process.StartInfo.CreateNoWindow = false;
    process.Start();
    log.Info("Process started by " + WindowsIdentity.GetCurrent().Name +  " with ID: " + process.Id);
    process.WaitForExit();
    log.Info("After WaitForExit Process ID: " + process.Id);
}
catch (Exception ex)
{
    log.Error("Error executing file with message " + ex.Message);
}

两个信息日志文本都被正确记录。未出现错误。但是被调用的程序不做任何事情。没有日志记录,没有在数据库中写入。用户对该文件具有可执行权限。

当我从Development Server调用相同的代码时,它工作得很好。

我使用IIS4.5和IIS7,我发现关于这个主题的帖子只适用于非常旧的.Net和.Net版本,这些帖子对我没有帮助。

我做错了什么?或者,我怎样才能找出哪里出了问题?

非常感谢,

编辑:为了更好地明确我的意图:我有这个(自制的) exe文件,它将数据从Excel工作表导入到数据库中。这需要一些时间。在这样做的同时,它还会使用log4net将其进度记录到数据库中。我想要一个用户界面(web应用程序),用户可以触发导入。在这个UI上还有一个ajax进度条,它显示了从数据库的日志表中导入takten的进度。

我希望在同一时间内最多运行此导入进程的一个实例。因此,我有一个检查进程是否仍在运行的函数。如果是这样,它就不允许启动另一个进程。如果没有,您可以重新启动它。

代码语言:javascript
复制
    private bool IsRunning(string name)
    {
        Process[] processlist = Process.GetProcesses();

        if (Process.GetProcessesByName(name).Length > 0  )
        {
            return true; 
        }
        else
        {
            return false;
        }
    }
EN

回答 3

Stack Overflow用户

发布于 2016-05-24 18:47:16

我现在通过TimeScheduler启动exe文件解决了这个问题。

path = exe文件的文件路径

参数=用于启动exe文件的参数

代码语言:javascript
复制
using Microsoft.Win32.TaskScheduler;


            using (TaskService taskService = new TaskService())
            {
                var taskDefinition = taskService.NewTask();
                taskDefinition.RegistrationInfo.Author = WindowsIdentity.GetCurrent().Name;
                taskDefinition.RegistrationInfo.Description = "Runs exe file";


                var action = new ExecAction(path, arguments);
                taskDefinition.Actions.Add(action);

                taskService.RootFolder.RegisterTaskDefinition("NameOfTask", taskDefinition);

                //get task:
                var task = taskService.RootFolder.GetTasks().Where(a => a.Name == "NameOfTask").FirstOrDefault();

                try
                {
                    task.Run();
                }
                catch (Exception ex)
                {
                    log.Error("Error starting task in TaskScheduler with message: " + ex.Message);
                }


            }
票数 2
EN

Stack Overflow用户

发布于 2016-04-27 20:22:25

如果您所说的开发服务器是指由Visual Studio启动的web服务器,那么这将给您一个错误的测试案例,因为该服务器是由Visual Studio启动并使用您的Windows帐户运行的,而标准配置的IIS不是在“用户”帐户下运行,而是在一个非常有限的系统帐户下运行(幸运的是!!)。即使用户使用您网站中的域帐户登录,IIS进程也不会在此帐户下运行(这无论如何都没有意义)。这就是为什么此代码无法在IIS中运行而将在您的开发服务器中运行的原因。即使您让exe启动,它也将使用IIS的系统帐户运行,因为您没有提供任何帐户,这是一个有限的帐户,它将再次运行不同于您预期的exe。

如果你真的想这样做,你将不得不使用模拟,但你将不得不启动这个过程来“模拟”登录到网站的用户,在这一点上,使用该用户帐户登录甚至是有意义的。例如,如果它是一个域帐户,这可能会起作用,但如果您使用某种其他类型的身份验证,如表单身份验证,这在操作系统级别上没有意义,因此您不能使用这些凭据在IIS中进行模拟。

在我的经验中,我已经做过几次了,在IIS中模拟总是一件坏事,并且总是制造问题,同样的情况也适用于通过way.Luckily启动命令行进程当你想到它时,总会有一个更好的/替代的解决方案。此外,等待进程在代码中结束也不是一种好的做法。如果进程阻塞怎么办?它将阻止网站。

幸运的是,当你考虑它的时候,总会有更好的/替代的解决方案。更好的/可能的解决方案是使用消息队列,例如,在消息队列中,您只需推送消息来执行任务,而在另一端是处理消息的应用程序,然后它可能会使用此命令行工具。该应用程序可以在您想要的任何用户帐户下运行,而不必让IIS在其他帐户下运行。当然,稍后您必须回来查看操作的结果,但这可以使用网站后台的回调来完成。虽然这个解决方案比你想做的要大一点,但它在几乎每个领域都会有更好的结果(你网站的响应性、可维护性、可伸缩性等等)唯一更糟糕的是您需要的代码行,但这很少是一个需要考虑的有效因素

票数 0
EN

Stack Overflow用户

发布于 2016-05-11 21:46:27

如果您自己编写处理excel的应用程序,则可以使用数据库中的表作为某种队列,而不是使用消息总线。然后,您的web应用程序只需要在该表中添加包含流程的所有必需信息的行,状态和进度就是其中之一。扩展您的处理应用程序以连续监视此表,一旦检测到新记录,它就可以开始执行必要的任务,并相应地更新数据库(进度、状态和最终结果)。这避免了消息传递子系统,将同样好地工作,并将避免您必须启动一个模拟进程,这从一开始就是一件坏事。

您可以将excel进程修改为windows服务,以使其连续运行并随系统启动,但是,如果您不想这样做,也可以使用工具将任何命令行应用程序作为windows服务运行。

这种技术比模拟要容易得多,并允许您的网站在其受保护的环境中运行

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36889154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档