Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In asp.net-mvc, what is the correct way to do expensive operations without impacting other users?

I asked this question about 5 years ago around how to "offload" expensive operations where the users doesn't need to wait for (such as auditng, etc) so they get a response on the front end quicker.

I now have a related but different question. On my asp.net-mvc, I have build some reporting pages where you can generate excel reports (i am using EPPlus) and powerpoint reports (i am using aspose.slides). Here is an example controller action:

    public ActionResult GenerateExcelReport(FilterParams args)
    {
        byte[] results = GenerateLargeExcelReportThatTake30Seconds(args);
        return File(results, @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", "MyReport.xlsx");
    }

The functionality working great but I am trying to figure out if these expensive operations (some reports can take up to 30 seconds to return) are impacting other users. In the previous question, I had an expensive operation that the user DIDN"T have to wait for but in this case he does have to wait for as its a syncronoous activity (click Generate Report and expectation is that users get a report when its finished)

In this case, I don't care that the main user has to wait 30 seconds but i just want to make sure I am not negatively impacting other users because of this expensive operation, generating files, etc

Is there any best practice here in asp.net-mvc for this use case ?

like image 807
leora Avatar asked Dec 08 '16 10:12

leora


People also ask

What are the 3 main components of an ASP.NET MVC application?

The Model-View-Controller (MVC) architectural pattern separates an application into three main components: the model, the view, and the controller. The ASP.NET MVC framework provides an alternative to the ASP.NET Web Forms pattern for creating MVC-based Web applications.

What are the features of ASP.NET MVC use to reduce the time taken in developing a controller?

Scaffolding reduces the time taken to develop a controller, view, etc. in the MVC framework.

How does ASP.NET MVC handle concurrency?

Test concurrency handlingChange a field in the first browser tab and click Save. The browser shows the Index page with the changed value. Click Save again. The value you entered in the second browser tab is saved along with the original value of the data you changed in the first browser.

What is the advantage of MVC over ASP NET?

Full features of ASP.NET One of the key advantages of using ASP.NET MVC is that it is built on top of the ASP.NET framework and hence most of the features of the ASP.NET like membership providers, roles, etc can still be used. Here is a detailed article on Creating a Simple Application Using MVC 4.0.

Are you prepared for ASP NET MVC interview questions?

If you're planning to attend a .NET Interview, you may also be prepared for ASP.NET MVC interview questions. MVC is the framework used to build Web applications for .NET and C#. In this article, I list the top 50 MVC questions and their answers. The answers are code examples written by authors of C# Corner. 1. What is MVC (Model View Controller)?

What is MVC (MVC)?

MVC is the framework used to build Web applications for .NET and C#. In this article, I list the top 50 MVC questions and their answers. The answers are code examples written by authors of C# Corner. 1. What is MVC (Model View Controller)? Model–view–controller (MVC) is a software architectural pattern for implementing user interfaces.

What is the MVC handler in IIS?

However, in IIS 6.0, the handler requires that you map the .mvc file name extension to the ASP.NET ISAPI DLL. The module and handler are the entry points to the ASP.NET MVC framework. They perform the following actions: Select the appropriate controller in an MVC Web application. Obtain a specific controller instance.


3 Answers

You can try combination of Hangfire and SignalR. Use Hangfire to kickoff a background job and relinquish the http request. And once report generation is complete, use SignalR to generate a push notification.

SignalR notification from server to client

Alternate option is to implement a polling mechanism on client side. Send an ajax call to enque a hangfire job to generate the report. And then start polling some api using another ajax call that provides status and as soon report is ready, retrieve it. I prefer to use SignalR rather than polling.

If the report processing is impacting the performance on the web server, offload that processing to another server. You can use messaging (ActiveMQ or RabbitMQ or some other framework of your choice) or rest api call to kick off report generation on another server and then again use messaging or rest api call to notify report generation completion back to the web server, finally SignalR to notify the client. This will let the web server be more responsive.

UPDATE Regarding your question

Is there any best practice here in asp.net-mvc for this use case

You have to monitor your application overtime. Monitor both Client side as well as server side. There are few tools you can rely upon such as newrelic, app dynamics. I have used newrelic and it has features to track issues both at client browser as well as server side. The names of the product are "NewRelic Browser" and "NewRelic Server". I am sure there are other tools that will capture similar info.

Analyze the metrics overtime and if you see any anomalies then take appropriate actions. If you observe server side CPU and memory spikes, try capturing metrics on client side around same timeframe. On client side if you notice any timeout issues, connection errors that means your application users are unable to connect to your app while the server is doing some heavy lifting. Next try to Identify server side bottlenecks. If there is not enough room to performance tune the code, then go thru some server capacity planning exercise and figure out how to further scale your hardware or move the background jobs out of the web servers to reduce load. Just capturing metrics using these tools may not be enough, you may have to instrument (log capturing) your application to capture additional metrics to properly monitor application health.

Here you can find some information about capacity planning for .net application from Microsoft.

-Vinod.

like image 93
Vinod Avatar answered Nov 03 '22 21:11

Vinod


These are all great ideas on how to move work out of the request/response cycle. But I think @leora simply wants to know whether a long-running request will adversely impact other users of an asp.net application.

The answer is no. asp.net is multi-threaded. Each request is handled by a separate worker thread.

like image 34
Robert Moskal Avatar answered Nov 03 '22 23:11

Robert Moskal


In general it could be considered a good practice to run long running tasks in background and give some kind of notification to user when the job is done. As you probably know web request execution time is limited to 90 seconds, so if your long running task could exceed this, you have no choice but to run in some other thread/process. If you are using .net 4.5.2 you can use HostingEnvironment.QueueBackgroundWorkItem for running long running tasks in background and use SignalR to notify user when the task is finished the execution. In case that you are generating a file you can store it on server with some unique ID and send to user a link for downloading it. You can delete this file later (with some windows service for example).

As mentioned by others, there are some more advanced background task runners such as Hangfire, Quartz.Net and others but the general concept is the same - run task in backround and notify user when it is done. Here is some nice article about different oprions to run background tasks.

like image 35
Alex Art. Avatar answered Nov 03 '22 21:11

Alex Art.