How Many Times Does HttpModule Init() Method Get Called During Application's Life
Jul 30, 2010
Web application initialization is as follows:
As we know when IIS receives the first request for a particular Asp.net application resource, IIS creates an instance of a HttpApplication (defined in global.asax codebehind).When this new instance is created it's initialization happens that also checks all configured HTTP modules.All modules are then instantiated and put in the application's Modules collection (of type HttpModuleCollection)modules are looped through and their Init() method is called (when they register for request events)
As far as I understand it the above scenario happens when a web application is started/initialized (hence application start event).What happens with modules?
Are they (re)instatiated on each request or reused from the Modules property on each consecutive request while the web application is alive? As I understand IIS and Asp.net they are reused through the whole life of a web application.
If they are reused, can we assume that their Init() method is actually a pseudo event handler for application start event? The thing is we can't attach to application level events within http modules. But if they are being reused we could use Init() as application start event and do whatever we'd put in global.asax instead.
Question,Can we assume that module's Init() method is called only on application start event? Could we use this assumption to i.e. register routes for applications whose global.asax codebehind we can't change? web.config is usually accessible and we can change it the way we want.Would this actually work?
Additional info,We can check HttpApplication code and check its InitModulesCommon() method. This one actually calls Init() of each registered HTTP module. What is more interesting is that this method is only used by InitIntegratedModules() and InitModules() methods. Which are both used only in HttpApplication.InitInternal() method. This is the basis of my assumptions, but I would like to know whether someone has abused IHttpModule.Init() for application start event.
I'm overriding the Controller.Initialize method to set some stuff before each ActionResult is executed, however I'm finding that the method is being called multiple times for each request (anywhere between 2 - 10 times). I'm running in Cassini.
My hunch is that it is running for all static files (images, css etc) as well as the requested action - although I may be wrong? I thought maybe something was wrong in my web.config but it all looks right to me.
In my MVC application ,I am updating my web.config at runtime through application_start event.So, ideally it should be done only when the application is started.BUT in MY mvc application the application_start event of global.asax is being called multiple times , even when i have not restarted the application.
Its being repetadly called when i am calling different actions , so the webconfig is repetedly updating & making my application very very slow. what's the reason & how to handle this .
I am trying to implement a custom HTTPModule for ASP.NET. I have a very simple html page with an image in it and an HTTPModule that hooks into the BeginRequest event. When I debug with Visual Studio's dev web server, my module is called twice: one for the initial page request, then once for the image request. This is what I expected. However, when I deploy my application to IIS, the module is only being called once for the page request.
I am creating a dynamic <asp:Table> based on a user's selection from a DropDownList. The number of columns and rows in the table depends on the user's choice from the DropDown.
The final two columns in each row needs to contain an Edit and Delete button. I am able to create these buttons programmatically. However, I am unable to get the click event to fire.
After researching this, it appears to be the case that my dynamic Web controls need to be created in the page Init method.
However, I am unable to do this as I do not know how many table rows, columns and buttons to create, until after the user has made a selection from a DropdownList.
I would be be very grateful for some tips on the correct way to create and enable the events for my dynamic buttons, in this scenario.
Here is a brief outline of how the program currently works (this is just a brief outline I quickly sketched, small details may be wrong!):
1) I know there are lots of web sites that describe in what order events are called during the Asp.Net page life-cycle. But is there also a tool, perhaps Reflector, that would enable me to figure out by myself in what order are ALL the page's events and their event handlers called during the page's life cycle? 2) Would you say that trying to figure out exactly what is going on under the hood is a good idea or a waste of time? To clarify - I'd like to figure out exactly what is going on when a control tree is build - thus all the method calls, all the events called etc needed for control tree to be build ( I imagine there are hundreds or perhaps thousands lines of code written just for building a control tree).
I am creating an Asp.net web site which will support dynamic data. When I am creating a dynamic web site from Scratch (from template in VS) all is working fine. But when I am trying to add dynamic entity (.edmx) file and running the application I am getting following error
"The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'. "
Using Forms authentication, for some reason my login page is called 9 times. it causes some browsers to show "too many redirects!". Even with no javascript and nothing in the page_load event, it is called 9 times.
I have a .NET 3.5 web application that uses SQL Server for its session state store. To improve scalability I wrote a class that implements IPartitionResolver that figures out which instance of SQL Server to use for a users session. All of this works great and just as expected.
However, when I was debugging one day I set a breakpoint at the bottom of the ResolvePartition method to make sure the correct connection string was being returned. To my surprise this breakpoint was hit many (~5-10) times per request! The same is true about breakpoints in the IPartitionResolver.Initialize method.
Does anyone know why this is? It seems to me that you would only need to call these methods once per request. It's not like the users session is going to move to a different instance of SQL Server mid request.
I have an application that uses an aps:GridView. The GridView is populated using a DataSource that calls a Stored Procedure. The DataSource passes parameters to the Stored Procedure based on some text fields. The page has been running slower than wanted, so I was doing some checking.
I ran SQL Profiler while loading the page, and saw the Stored Procedure was being called twice. I stepped through the code and found out that in the Page Load Complete event was where this was happening. In this event, I set the value of a parameter for the Stored Procedure, then did a DataBind on the GridView to pick up the data. As I was stepping through the code, I watched the SQL Profiler. When I got to the step of setting the parameter, the Stored Procedure had not yet been called. When I stepped through that and got to the DataBind command (before running that step), the SQL Profiler showed that the Stored Procedure had been called. Then I did the DataBind and the StoredProcedure was called again.
My question is, how do I get the parameters set, and get the GridView data bound, and only call the StoredProcedure once? If I comment out the DataBind step, the StoredProcedure never does get called (which seems really strange to me...).
I have written an Http Module that hooks onto the Response.Filter property of the current request and does various replacements within the HTML before it is sent to the client.All the work is done in the Write method which is overriding Write in the base class Stream.
The Write method is called multiple times for a single response - the HTML seems to be written to the output stream in chunks. My problem is that I don't have an efficient & reliable way of telling if the current chunk is the last chunk (for why I want to know this see below). The only way I have come up with is to check if the chunk contains a closing html tag - but this is not very efficient or reliable.
The reason this is needed is that the module must add the "Refresh" HTTP header to the response, but only if the HTML fulfills certain conditions (and there are certain conditions that mean the header must not be added). So, only when the last chunk has been seen does the code know if the header can be added or not. So, I either need a test for the last chunk, or on each call to Write I add the header if the current block of HTML passes the test (if it has not already been added) or remove the header if the current block of HTML fails the test (if it has already been added).
So, is there a better way to test for the last chuck OR is there a way to test for a particular header being in the response and delete it (there doesn't seem to be a way to do this - only to append headers)?
so here is the setup. I am building a page that has a listview, a datapager, and 3 datapagerfield (2 x NextPreviousPagerField, 1 x NumericPagerField), and a objectdatasource to tide all of this together.
It was all working fine until I put a breakpoint into the SelectMethod specified in the objectdatsource control. It seems like that for each datapagerfield control, it is calling the selectmethod and selectcount method. Hence, whenever a user paged, it calls the database 6 times instead of 2 (I don't have caching turned on atm). If I remove one datapagerfield, it will remove 2 calls.
Now this is build in asp.net 3.5 SP1 in VS2008. When I copied the same code files to a asp.net 4.0 VS2010 solution, it duplicate call seems to be gone.
We are trying to remove the global.asax from our many web applications in favor of HttpModules that are in a common code base. This works really well for many application events such as BeginRequest and PostAuthentication, but there is no Application Start event exposed in the HttpModule.
I can think of a couple of smelly ways to overcome this deficit. For example, I can probably do this:
protected virtual void BeginRequest(object sender, EventArgs e) { Log.Debug("Entered BeginRequest..."); var app = HttpContext.Current.Application; var hasBeenSet app["HasBeenExecuted"] == null ? false : true; if(!hasBeenSet) { app.Lock(); // ... do app level code app.Add("HasBeenExecuted", true); app.Unlock(); } // do regular begin request stuff ... }
But this just doesn't smell well to me.
What is the best way to invoke some application begin logic without having a global.asax?
The httpmodule is used in my web application. I want to set the property in the httpmodule when my application starts and not have the overhead of setting it everytime the module is called.
The value for the application is read from my app settings in the web.config.
The httpmodule resides in a seperate dll to the web application.
So I want to inject/set the property from my web application on application start.
Most succinctly, my question is whether an ASP.NET 4.0 app running under IIS 7 integrated mode should be able to honor this portion of my Web.config file:
I'm experimenting with mixed mode authentication (Windows and Forms - I know there are other questions on S.O. about the topic). Using IIS Manager, I've disabled Anonymous authentication to auth/windows/winauth.aspx, which is within the location path above. I have Failed Request Tracing set up to trace various HTTP status codes, including 302s.
When I request the winauth.aspx page, a 302 HTTP status code is returned. If I look at the request trace, I can see that a 401 (unauthorized) was originally generated by the AnonymousAuthenticationModule. However, the FormsAuthenticationModule converts that to a 302, which is what the browser sees. So it seems as though my attempt to remove that module from the pipeline for pages in that path isn't working. But I'm not seeing any complaints anywhere (event viewer, yellow pages of death, etc.) that would indicate it's an invalid configuration. I want the 401 returned to the browser, which presumably would include an appropriate WWW-Authenticate header.
A few other points: a) I do have <authentication mode="Forms"> in my Web.config, and that is what the 302 redirects to; b) I got the "name" of the module I'm trying to remove from the inetservconfigapplicationHost.config file; c) I have this element in my Web.config file: <modules runAllManagedModulesForAllRequests="false">.
the purpose of this HttpModule? It's showing up on my HttpModuleCollection list, but I don't know what's it's for.System.ServiceModel.Activation.HttpModule
I am having a problem with getting a listbox to update after the add method is called. I am using an AsyncFileUpload control and as part of the AsyncFileUpload1_UploadedComplete I am creating a listItem and then adding that to the listbox. The item will not appear in the listbox. I have tried putting the listbox in an update panel and then calling the Update method on the panel from within the AsyncFileUpload1_UploadedComplete procedure and that too fails to update the listbox. I can call the Update method on the panel from a separate procedure and still the listbox will not update with the item added in the AsyncFileUpload1_UploadedComplete method.
Let's say we are building some public service that grabs the setup of a user (what server, user and pwd he wants to perform the call), logs in into that server and do some processing...
the process takes about 15 seconds to complete each user has a different setup (server/user/pwd), so the process needs to run against each one
if 1000 users tells the system to run the method at 1:00PM
How can I insure that the method is processed in the next 15 minutes?
What should be the correct approach to this little problem?
I'm thinking that I need to do something Asynchronously, and parallel processing could speed up things, maybe throttling the processes, maybe execute 100 calls per each 30 seconds?
I never did something like this and would love to get your feedback on ideas and future problems just to spend 100 hours of work and realize that I took a wrong road
I can't understand why the method LoadViewState() is not called after the postback in my code below.After label1 cahnges its text the "__VIEWSTATE" hidden field is modified, but LoadViewState() is not called.
I have a controller method that returns a jSON object and in one calling situation, it works and in another calling situation, it does not work. When the URL in my browser is this:
http://localhost:65247/Client -- it works.
But, when my url looks like this:
http://localhost:65247/Client/UserAdmin?id=6 -- it DOES NOT work
In a nutshell, clients have users. From within the client, I wish to work on a specific user (this is the UserAdmin view). In this case, the client id is 6. From within the UserAdmin view that was launched with Id=6, I then wish to select a user from a dropdown. The idea was to use javascript and $.getJSON to fetch data for the specific user so as not to have to refresh the entire page. I use this approach in other parts of the app. The only difference I can see is with the URL in the browser. It would appear the presence of parameters via the '?' is futzing things up a bit.
In one view (view1) there is a text box and a button beside it. i click on that button, i am popping another view (Create view) as a seperate window. in create view i am entering some values and creating a record in db. out of these values one value i have to send back to "View1". how can i send this value? i am opening view2 from view1 like
View2 contains some fields like Name,Email etc... and I click "Create" to call HTTPPOST. there i add the values to db including a generated guid. i want to send this ID to view1.