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

我使用visual studio 2012创建了一个asp.net控制台应用程序,控制台应用程序是我们的ERP系统和我们的自定义数据库之间的同步工作。 现在我需要这个同步作业及时运行,所以我在我们的Windows任务调度程序下创建了一个新任务,它每小时调用一次控制台应用程序,效果很好。

但我需要能够由最终用户手动运行控制台应用程序,主要是用户可以登录我们的Web应用程序(asp.net mvc),然后他们可以点击“同步”按钮,这里有“同步”按钮将主要调用控制台应用程序…这可能吗? 我的意思是我可以让我的Web应用程序调用控制台应用程序,就像Task Schuler调用控制台应用程序一样吗?

第二个问题,如果我设法从我的asp.net mvc web应用程序调用控制台应用程序,这会强制控制台应用程序在IIS下运行吗? 或者Web应用程序可以在IIS范围外调用控制台应用程序? 类似于从任务调度程序调用控制台应用程序?

问题1:是的,你可以。

public ActionResult Index() { Process.Start(@"c:\Windows\System32\cmd.exe"); return View(); } 

问题2:该过程将在IIS帐户下运行,该帐户可能没有您的流程所需的权限。 您可以在调用Process.Start()之前模拟其他用户。 看这个例子:

更改用户运行Windows窗体程序

您可以创建一个Web服务( 使用asp.net web api )并将您的同步代码放在其中。 Web API可以托管在IIS中(或者您也可以执行非IIS托管),当用户单击UI中的同步按钮时,您可以从asp.net mvc应用程序访问此Web api端点。 您可以使用HttpClient类对Web api进行Http调用。

现在,从您从任务调度程序调用的控制台应用程序中,您可以执行相同的操作。 即:您可以使用HttpClient类对Web api端点进行http调用,该端点执行您的代码以同步您的数据。

虽然这回答了你原来的问题,但在asp.net线程上运行这样的后台任务并不是一个好主意 。 App域可能会因为很多原因而随时关闭,它也会占用您长时间运行的任务。 但幸运的是,有一些优雅和简单易用的解决方案。

  1. 迟发型
  2. FluentScheduler
  3. 石英

这些库是围绕在ASP.NET中后台手动运行某些代码的一些缺陷而设计的。 看一下这篇博客文章 ,其中scott解释了如何使用这些库。

您可以从Web应用程序执行任何命令,您可以在此处查看从C#代码运行exe