我使用visual studio 2012创建了一个asp.net控制台应用程序,控制台应用程序是我们的ERP系统和我们的自定义数据库之间的同步工作。现在我需要这个同步作业及时运行,所以我在我们的Windows任务调度程序下创建了一个新任务,它每小时调用一次控制台应用程序,效果很好。
但我需要能够由最终用户手动运行控制台应用程序,主要是用户可以登录我们的Web应用程序(asp.net mvc),然后他们可以点击“同步”按钮,这里“同步“按钮将主要调用控制台应用程序......这可能吗?我的意思是我可以让我的Web应用程序调用控制台应用程序,就像Task Schuler调用控制台应用程序一样吗?
第二个问题,如果我设法从我的asp.net mvc web应用程序调用控制台应用程序,这会强制控制台应用程序在IIS下运行吗?或者Web应用程序可以在IIS范围外调用控制台应用程序?类似于从任务调度程序调用控制台应用程序?
答案 0 :(得分:5)
问题1:是的,你可以。
public ActionResult Index()
{
Process.Start(@"c:\Windows\System32\cmd.exe");
return View();
}
问题2:该过程将在IIS帐户下运行,该帐户可能没有您的流程所需的权限。您可以在调用Process.Start()之前模拟其他用户。见这个例子:
答案 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域可能会因为很多原因而随时关闭,它也会占用您长时间运行的任务。但幸运的是,有一些优雅且易于使用的解决方案。
这些库是围绕在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服务运行应用程序