I have some simple classes that need to be disposed a the end of the request.
For that end I call the Dispose method on those objects from the Application_EndRequest event in Global.asax.
This “works fine on my machine” but causes some problems on my production server where I get Cannot access a disposed object. This happens in some MVC helpers.
It seemed to me like Application_EndRequest is triggered at the end of the request. Is this not the case? Is there another event I should be using to dispose my objects?
Application pool issues – likely
I suspect that your disposable object isn’t bound to request but rather app wide (it may be instantiated per request but it may be using some shared resources). As long as you’re testing your application in development environment it seems to behave as expected but as soon as you put it in production you get issues. This indicates you may have problems with application pool.
IIS web application pool capabilities actually instantiate several
HttpApplicationinstances for your application and they may all share common disposable resources. If that’s the case with your disposable object and you’re sharing it it may be that it isn’t thread safe. The same would be true when you wouldn’t wrap your shared resource usage inside thread safe operations.That’s why it may happen that while one request is in progress another one begins and the first one disposed the object while the second process still uses it.
More information is always helpful
If you’d explain the nature of your disposable object/resource and how you’re using it in your application we could help you much better. But in the meantime, you could read my blog post that talks about application pools and handling them. It’s not about disposable objects per se, but you may still find all the information very useful and helpful.