从我的asp.net mvc web应用程序调用asp.net控制台应用程序

6

我使用Visual Studio 2012创建了一个ASP.NET控制台应用程序,该控制台应用程序是我们ERP系统和自定义数据库之间的同步作业。现在我需要这个同步作业定时运行,因此我在Windows任务计划程序下创建了一个新任务,每小时调用一次控制台应用程序,这很有效。

但是我需要用户能够手动运行控制台应用程序,主要是用户可以登录到我们的Web应用程序(ASP.NET MVC),然后他们可以单击“同步”按钮,其中此“同步”按钮将主要调用控制台应用程序...这是可能的吗?我的Web应用程序是否可以调用控制台应用程序,就像任务计划程序调用控制台应用程序一样?

第二个问题,如果我成功从我的ASP.NET MVC Web应用程序调用控制台应用程序,这会强制控制台应用程序在IIS下运行吗?还是Web应用程序可以在IIS范围之外调用控制台应用程序?类似于从任务计划程序调用控制台应用程序?

4个回答

7
问题1:是的,你可以。
public ActionResult Index()
{
    Process.Start(@"c:\Windows\System32\cmd.exe");
    return View();
}

问题2:该进程将在IIS帐户下运行,该帐户可能没有您的进程需要的特权。您可以在调用Process.Start()之前模拟另一个用户身份。请参见此示例:

更改运行Windows Forms程序的用户


当我说IIS范围内并不是指权限,我的问题如下:假设我的Web应用程序调用控制台应用程序并启动运行,在控制台应用程序执行期间,应用程序池重新启动,这会导致控制台应用程序也重新启动吗?还是不会受到影响。 - user1404577
1
哦,我明白了。我非常确定它会继续运行。在Windows中,杀死父进程通常不会对未与父进程通信的子进程产生影响。 - Frank Hagenson
不用担心,也许我没有解释清楚我的问题。你的意思是说我可以让我的ASP.NET MVC调用我的控制台应用程序,就像任务计划程序调用控制台应用程序一样。当然,使用任务计划程序会按时调用它,而从Web应用程序中由最终用户手动调用它... - user1404577
你能提供一些链接,展示如何从我的ASP.NET MVC调用控制台应用程序吗? - user1404577
3
我刚试了一下,即使你停止了IIS,这个进程仍然会继续运行。需要翻译的代码如下:公共动作结果 Index() { 进程.Start(@"c:\Windows\System32\cmd.exe"); 返回视图(); } - Frank Hagenson
请注意,此示例有限。它回答了手头的问题,但如果您需要指定窗口属性或重定向输出和错误,则需要在Process对象或ProcessStartInfo对象中手动构建一系列选项,然后将其分配给Process。此外,许多人尝试从ASP.NET启动进程时会遇到权限问题,这导致了模拟等主题,还取决于进程运行的时间长短,最好研究以异步方式运行此过程,并包括一些等待时间错误处理。 - DtechNet

3
您可以创建一个Web服务(使用ASP.NET Web API),并将同步代码放入其中。Web API可以在IIS中托管(或者也可以进行非IIS托管),当用户在UI中点击同步按钮时,您可以从ASP.NET MVC应用程序访问此Web API端点。您可以使用HttpClient类来进行Http调用以访问Web API。
现在,从任务计划程序调用的控制台应用程序中,您也可以执行相同的操作。也就是说:您可以使用HttpClient类对Web API端点进行Http调用,该端点会执行您的代码以同步数据。
虽然这回答了您最初的问题,但在ASP.NET线程上运行此类后台任务不是一个好主意。应用程序域可能因为很多原因而随时关闭,并且它也会关闭您的长时间运行的任务。但幸运的是,有一些优雅且简单易用的解决方案可用。
  1. HangFire
  2. FluentScheduler
  3. Quartz
这些库是围绕手动在ASP.NET后台运行某些代码时避免一些陷阱而设计的。请查看博客文章,其中Scott解释了如何使用这些库。

但是不建议在IIS下运行后台作业,比如我的同步作业。这就是为什么我选择将同步作业作为控制台应用程序的原因。但是我希望能够让最终用户从我们的Web应用程序中手动执行这个控制台应用程序,除了使用任务计划程序定期执行之外。 - user1404577
现在有很多讨论可以展开,我之前使用过HangFire,但最终发现IIS并不适合运行后台作业,所以我选择将其作为控制台应用程序。但我想知道是否可以从我的asp.net mvc中调用这个控制台应用程序... - user1404577
你可以保留两个选项(任务调度程序和Web API),并且可以保留一个表记录来跟踪你的活动是否成功完成。如果没有成功运行,可以再次运行。 - Shyju
1
任何解决方案都可能出现问题 :) 对我来说,从任务计划程序执行的控制台作业似乎是一个强大的选择。此外,如果您非常关注从其他C#代码(MVC应用程序)调用控制台应用程序,请查看http://www.dotnetperls.com/process - Shyju
1
你知道吗,选择如何运行后台作业是我所面临的最令人困惑的话题之一。许多人说IIS通常不适合运行后台作业,特别是长时间运行的后台作业。但另一方面,有许多工具,比如Hangfire,专门设计用于在IIS下运行后台作业,并且许多文章支持这些工具http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx。但也可以找到许多人反对这些工具...所以不确定应该遵循哪种观点? - user1404577
显示剩余6条评论

0
创建一个 Web API,它与 Windows Service 进行通信(可能使用 gRPC)。 当用户点击按钮时,请求命中 Web API 端点 --> gRPC 调用到 Windows Service(gRPC 服务器)--> Windows Service 运行应用程序。

-1

但是这个命令会在IIS范围内运行吗?因为我想避免我的同步作业在IIS范围内运行。 - user1404577

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接