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

时间:2016-01-13 01:53:30

标签: c# asp.net .net asp.net-mvc

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

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

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

4 个答案:

答案 0 :(得分:5)

问题1:是的,你可以。

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

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

Change user for running windows forms program

答案 1 :(得分:4)

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

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

虽然这回答了您原来的问题,但它是not a good idea to run such a background task on an asp.net thread。 App域可能会因为很多原因而随时关闭,它也会占用您长时间运行的任务。但幸运的是,有一些优雅且易于使用的解决方案。

  1. 迟发型
  2. FluentScheduler
  3. Quartz
  4. 这些库是围绕在ASP.NET中后台手动运行某些代码的一些缺陷而设计的。看看这个blog post,其中scott解释了如何使用这些库。

答案 2 :(得分:0)

您可以从Web应用程序执行任何命令 你可以看看这里 Run an exe from C# code

答案 3 :(得分:0)

创建一个与Windows服务通信的Web api(可能使用grpc)。 用户单击按钮->请求访问Web api端点-> grpc调用Windows服务(grpc服务器)-> Windows服务运行应用程序