Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从我的asp.net mvc web应用程序调用asp.net控制台应用程序_C#_Asp.net_.net_Asp.net Mvc - Fatal编程技术网

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

C# 从我的asp.net mvc web应用程序调用asp.net控制台应用程序,c#,asp.net,.net,asp.net-mvc,C#,Asp.net,.net,Asp.net Mvc,我使用visual studio 2012创建了一个asp.net控制台应用程序,该控制台应用程序是ERP系统和自定义数据库之间的同步作业。现在我需要这个同步作业及时运行,所以我在windows任务调度器下创建了一个新任务,它每小时调用控制台应用程序,效果很好 但我需要有能力由最终用户手动运行控制台应用程序,主要用户可以登录到我们的web应用程序(asp.net mvc),然后从那里他们可以单击“同步”按钮,这个“同步”按钮将主要调用控制台应用程序。。。那么这可能吗?我的意思是,我可以让我的we

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

但我需要有能力由最终用户手动运行控制台应用程序,主要用户可以登录到我们的web应用程序(asp.net mvc),然后从那里他们可以单击“同步”按钮,这个“同步”按钮将主要调用控制台应用程序。。。那么这可能吗?我的意思是,我可以让我的web应用程序调用控制台应用程序,就像任务Schuler调用控制台应用程序一样吗


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

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

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

虽然这回答了您最初的问题,但事实确实如此。由于很多原因,应用程序域随时都可能宕机,这也会使您的长期运行任务宕机。但幸运的是,有一些优雅且简单易用的解决方案可用

  • 绞刑
  • FluentScheduler
  • 石英

  • 这些库是针对ASP.NET中在后台手动运行某些代码的一些缺陷而设计的。请看一看scott在其中解释了如何使用这些库。

    您可以从web应用程序执行任何命令 你可以看看这里
    问题1:是的,你可以

    public ActionResult Index()
    {
        Process.Start(@"c:\Windows\System32\cmd.exe");
        return View();
    }
    
    问题2:进程将在IIS帐户下运行,该帐户可能没有进程所需的权限。您可以在调用Process.Start()之前模拟其他用户。请参见此示例:


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

    但此命令是否在IIS作用域下运行,因为我想避免同步作业在IIS作用域下运行?当我说在IIS作用域下,我不是指权限,,我想问的是:-现在假设我的web应用程序调用控制台应用程序,控制台应用程序开始运行,并且在控制台应用程序执行期间,应用程序池重新启动,,这是否会导致控制台应用程序也重新启动..或者它不会受到影响。哦,我明白了。我很肯定它会继续下去。在Windows中,终止父进程通常对不与父进程通信的子进程没有影响。不要担心,可能我没有解释我的问题。。你的意思是我可以让asp.net mvc调用我的控制台应用程序,就像任务调度器调用控制台应用程序一样。当然,使用tasks scheduler会临时调用它,而web应用程序会由最终用户手动调用它…您能否提供一些链接,说明如何从asp.net mvc调用控制台应用程序?public ActionResult Index(){Process.Start(@“c:\Windows\System32\cmd.exe”);return View()}我刚刚尝试了这个方法,即使您停止IIS,进程也会保持运行,但不建议在IIS下运行后台作业,例如我的同步作业。。这就是为什么我选择将同步作业作为控制台应用程序的原因,但我希望最终用户能够从我们的web应用程序中手动执行此控制台应用程序,此外还可以使用任务调度器及时执行…现在这里有很多讨论,现在我以前使用了HangFire,,但最终IIS不是设计用来运行后台作业的,所以我选择将其作为控制台应用程序,但我想知道我是否可以从asp.net mvc调用此控制台应用程序…使用hangfire运行后台作业时,我还面临一个问题,即如果网站上没有任何活动,在第一个用户访问应用程序之前,后台作业不会运行,这与后台作业作为任务调度器中的任务运行不同。。。虽然将始终按计划运行,但任何解决方案都可以运行:)从任务计划程序执行的控制台作业对我来说似乎是一个健壮的选项。另外,如果您非常喜欢从其他c#代码(mvc应用程序)调用控制台应用程序。看看你是否知道,选择如何运行后台作业是我遇到过的最令人困惑的话题,因为很多人都说IIS不是设计用来运行一般的后台作业,特别是长时间运行的后台作业。但另一方面,也有很多工具,比如hangfire,它是为在iis下运行后台作业而设计的,很多文章都支持这些工具,但是你也可以发现很多人也反对这些工具。。。所以不确定哪种观点是正确的?