6

I have created an asp.net console application using visual studio 2012, the console application is a sync job between our ERP system and our custom Database. now i need this sync job to run on timely basis , so i created a new task under our windows task scheduler , which calls the console application each hour, which works well.

but i need to have the ability to run the console application manually by end users,, mainly users can login to our web application (asp.net mvc) and from there they can click on "Sync" button , where this "Sync" button will mainly calls the console application... so is this possible ? i mean can i have my web application calls the console application , the same way the Task Schuler calls the console application ?

second question, if I manage to call the console application from my asp.net mvc web application,, will this force the console application to run under IIS ? or the web application can call the console application outside the IIS scope ? similar to calling the console application from Task scheduler ?

4 Answers 4

7

Question 1: Yes you can.

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

Question2: The process will run under the IIS account, which may not have the privileges your process needs. You can impersonate another user before calling Process.Start(). See this example:

Change user for running windows forms program

Sign up to request clarification or add additional context in comments.

6 Comments

when I am saying under IIS scope I do not mean permission,, what I am asking about is as follow:- now let say my web application calls the console application and the console application start running , and during the console application execution the application pool restart,, will this cause the console application to restart also ..or it will not get affected.
Oh I see. I'm pretty sure it will continue. In Windows killing the parent process generally has no effect on child processes that are not communicating with the parent.
do not worry maybe I did not explain my question.. so you mean I can have my asp.net mvc calls my console application , in the same way as the task schdulerer calls the console application. of course using tasks scheduler will call it on timly basis , while from the web application will call it manually by end users...
can you provide some links which shows how I can call a console application from my asp.net mvc ?
public ActionResult Index() { Process.Start(@"c:\Windows\System32\cmd.exe"); return View(); } I just tried this and the process stays running even when you stop IIS
|
3

You can create a web service(use asp.net web api) and put your synchronization code inside that. The Web API can be hosted in IIS ( or you can do a non IIS hosting as well) and you can access this web api endpoint from your asp.net mvc application when user clicks on the sync button in the UI. You may use HttpClient class to make the Http call to the web api.

Now from your console application, which is being invoked from the task scheduler, you can do the same. ie: you can use HttpClient class to make an http call to the web api endpoint which executes your code to sync your data.

While this answers your original question, It is not a good idea to run such a background task on an asp.net thread. The App domain can go down at any time for a lot of reasons and it will take down your long running task as well. But fortunately there are some elegant and simple to use solutions available.

  1. HangFire
  2. FluentScheduler
  3. Quartz

These libraries have been designed around some of the pitfalls of manually running some code in the background in ASP.NET. Take a look at this blog post where scott explains how to use these libraries.

11 Comments

but it is not recommended to have background jobs such as my sync job to run under IIS .. That why I chose to have the sync job as a console application,, but I want to have the ability for this console application to be manually executed by end users from our web application, in addition to being executed on timely basis using task schdulerer....
now there are lot of discussion that can go here,, now I used HangFire previously,, but at the end IIS is not designed to run background jobs ,, so that why I chose to have it as a console application ,, but I want to know if I can call this console application from my asp.net mvc ...
also one thing I faced when using hangfire to run background jobs, is that if there is not any activity on the web site, the background job will not run, till the first user access the application,, unlike having the background job runs as a task inside the task schdulerer ... while will always run as scheduled
Any solution can go down :) Console job executed from your task scheduler seems to be a robust option to me. Also IF you are very particular about calling your console app from your other c# code(mvc app). Take a look at dotnetperls.com/process
Do you know something that choosing how to run background jobs is the most confusing topic I have ever faced,, As many people say that IIS is not designed to run background jobs in general and specifically long running background jobs . but on the other side there are many tools such as hangfire which is designed to run background jobs under iis and many articles support these tools hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx ,, But also you can find many people are against these tools also ... so not sure which opinion is the right one to follow?
|
0

create a web api which communicates to a windows service (possibly using grpc). user clicks button --> request hits web api endpoint --> grpc call to windows service (grpc server) --> windows service runs the application

Comments

-1

You can execute any command from your web application you can look here Run an exe from C# code

1 Comment

but will this command runs under IIS scope as I want to avoid having my sync job runs under IIS scope ?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.