��� 
Handjob porn freesex dildo video

ASP.NET MVC, session state and concurrent requests: not what you’d expect September 28, 2010

Using ASP.NET’s session storage and management providers for web applications is a no-brainer. User’s preferences, external API access tokens, uploaded documents, you name it, it usually makes sense. We’ll move it into the database when it gets too big, right?

Our new photo book creation and printing service, Poyomi (a little tech intro) uses the session state via MVC’s wrapper class HttpSessionStateBase which is provider as the SessionData property on a MVC controller. We store pretty much everything before the finished photo book is assembled: cover design, book’s designed pages, photo assembly preferences, perhaps an access token for flickr or SmugMug…

Poyomi has to render many preview images for a client, doing it so asynchronously by offloading the rendering work to backend servers. A single page’s design and contained photos come from a serialized object in the session itself, that is then transferred via AMQP to the queue processor. All the MVC web app has to do is to wait for the response and pass it over to the client.

Since each photo book contains many pages, browsers will try to load images using multiple concurrent requests at the same time. That shouldn’t be a problem for the massively threaded queue processor and a simple MVC app, right?

Unfortunately, no. All of the little thumbnails were being loaded sequentially and the backend was doing just a single rendering job at a time. What was going on? I took a look at IIS’ requests page (IIS manager > Home > IIS section > Worker Processes > Right click on the Pool > View Current Requests).

IIS requests trace

Huh? A single request at a time. Talk about abysmal performance.

More consequences on typical ASP.NET MVC websites

AJAX requests often get used to offload time intensive operations. In case all of your HTTP requests, AJAX or not, demand the usage of the session data, they will all block each other. In case the user decides to “cancel” the current background operation by clicking on a link to another page on your site, the execution of it will be delayed until all of the existing requests finish processing.

ASP.NET’s session state

Digging and debugging revealed that it all has to do with the way ASP.NET handles session access. You can read about it more at MSDN.

By default, no concurrent access to the session state is allowed. Even read-only requests (as far as the session is concerned) will be locked exclusively to prevent potential corruption of its state. There is a global or per-ASPX-page setting called EnableSessionState to alter this behavior: either by disabling the session state altogether… which isn’t really useful in our case… or by marking certain pages as being read-only and thus enabling parallel execution of read-only requests. Yay! But what about our cool and modern ASP.NET MVC 2 application?

Well, it can be done. But doing so requires a visit to the MvcFutures department. I’ve found a single lone blog post that describes the required changes to your MVC execution flow – presumably by a coworker of the one that programmed the solution. Essentially, it implements a new controller factory that is able to set the session state mode per the controller being executed.

Setting the session state mode in ASP.NET MVC 2

  1. Download the MvcFutures library. Add a local reference to the Microsoft.Web.Mvc.dll library.
  2. Add the module into your project’s Web.config to load the dynamic session controller factory. Add the highlighted lines:

    <httpModules>
      <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>  
      <add name="MvcDynamicSessionModule" type="Microsoft.Web.Mvc.MvcDynamicSessionModule, Microsoft.Web.Mvc, Version=2.0.0.0"/>
    </httpModules>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="ScriptModule"/>
        <remove name="UrlRoutingModule"/>
        <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
        <add name="MvcDynamicSessionModule" type="Microsoft.Web.Mvc.MvcDynamicSessionModule, Microsoft.Web.Mvc, Version=2.0.0.0"/>
    </modules>
    

    Add this module after the routing module.

  3. Tell MVC to use the new dynamic session controller factory by instantiating and assigning it in your Global.asax.cs file:

    protected void Application_Start() {
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);
        ControllerBuilder.Current.SetControllerFactory(new MvcDynamicSessionControllerFactory());
    }
    
  4. Use the session state attribute on your controller:

      [ControllerSessionState(ControllerSessionState.ReadOnly)]
      public class AjaxReadonlyController : Controller {
    

    Other state modes are: Required (equivalent to Default), ReadOnly and Disabled.

Enjoy your high-performance website!

Using Autofac with DynamicSessionControllerFactory

If you are using Autofac for dependency injection (and why aren’t you?) you’ll have to nest the two controller factories. Global.asax.csApplication_Start:

var factory = new AutofacControllerFactory(ContainerProvider);
var dyn = new MvcDynamicSessionControllerFactory(factory);
ControllerBuilder.Current.SetControllerFactory(dyn);

Also, be warned that you cannot inject the session data object into your classes anymore. For example, if you were using something akin to:

var builder = new ContainerBuilder();
builder.Register(s => HttpContext.Current.Session).As().HttpRequestScoped();

…then this won’t work anymore. The controller’s SessionData property is null until MVC gets around to executing your method. You’ll have to pass it to instances that were already instantiated by Autofac’s controller factory at execution time.

In conclusion

I’m sure that almost every MVC project uses the session for storage of little tokens, strings, counters… which by default blocks the execution of parallel requests. Surprisingly, almost no one blogged about this before. Hopefully this article will add some exposure to this problem.

All of this applies to ASP.NET MVC 2, the latest production ready version. Please let me know if this is going to be implemented in MVC 3 without the usage of MvcFutures!

1,932 Comments

You stated this fantastically.

Parajumpers Jackets January 9th, 2014

Thats why here we Describe all review of each laptop. If you head to the store they are usually called ring cushions. ” Given that the parajumpers ski wear was incorporated as recently as 2005 investors should be impressed with Seadrill’s ability to grow and manage such substantial assets. That little piece of label that I stick onto my kids shoes, school bags,parajumpers outerweargfdddz5482, school uniforms,Parajumpers Outletgfdddz5482, tumblers, lunch boxes and more help me organize my childre

enrilmery January 9th, 2014

50歳代の管理職を全員、福島県に異動させるという東京電力 [url=http://www.funtimebr.com/]グッチ バッグ アウトレット[/url] の異例の人事策が、社内外で波紋を呼んでいる。福島第1原子力発電所 [url=http://www.funtimebr.com/]グッチ 店舗[/url] 事故当時の首脳は既に退陣したが、国費の追加投 [url=http://www.funtimebr.com/]http://www.funtimebr.com/[/url] 入を受け、当時50歳以上の管理職まで一定の責任を負 [url=http://www.audreyisher.name/]アグ 店舗[/url] わされる形となったからだ。厳しすぎる人事策は士気の低下を招く恐れもある。「進駐軍による守旧派 [url=http://www.audreyisher.name/]アグ アウトレット[/url] の一掃。ここまでやる [url=http://www.audreyisher.name/]http://www.audreyisher.name/[/url] とは…」。エネルギー業界の関係者は絶句する。東電 [url=http://www.pecye.net/]ケイトスペード 財布[/url] の現在の総合特別事業計画(再建計画)は平成24年5月に政府認 [url=http://www.pecye.net/]ケイトスペード 新作[/url] 定され、東電は実質 [url=http://www.pecye.net/]http://www.pecye.net/[/url] 国有化された。当時の勝俣恒久会長ら経営陣の大半が退任し、取締役の過半数は社外取 [url=http://www.auroralimofl.com/]SEIKO 腕時計[/url] 締役に。退任した経営陣は東電本店の建物に入れなくなり、 [url=http://www.auroralimofl.com/]SEIKO 腕時計[/url] 影響力はなくなった。その代わり経済産業省や原子力損害賠償支援機構の意 [url=http://www.auroralimofl.com/]http://www.auroralimofl.com/[/url] 向が強く反映されるようになった。

  さらに、従業員の給与を管理職は3割、一般職は2割削減。一般職 [url=http://www.rodfincannon.com/]ケイトスペード 財布[/url] は残業手当などがつくため、一部 [url=http://www.rodfincannon.com/]ケイトスペード 財布[/url] では管理職と一般職で給与の逆転現象が起き、管理職の [url=http://www.rodfincannon.com/]http://www.rodfincannon.com/[/url] 退職が急増した。東電は管理職をつ [url=http://www.lipsynctv.com/]coach 財布[/url] なぎ留めるため、今夏には1人10万円の一時金を支給したほどだ。新計画では、 [url=http://www.lipsynctv.com/]coach バッグ[/url] 国費のさらなる投入を受け、一部の社外取締役から事 [url=http://www.lipsynctv.com/]http://www.lipsynctv.com/[/url] 故当時の管理職への責任追及を求める声が強まったという。実際、勝俣前会長らの薫陶を受けた50歳 [url=http://www.brcustomwoodwork.com/]ケイトスペード アウトレット[/url] 代の管理職を本店から外すことで [url=http://www.brcustomwoodwork.com/]ケイトスペード 財布[/url] 、「“守旧派一掃”が完了する」と [url=http://www.brcustomwoodwork.com/]http://www.brcustomwoodwork.com/[/url] の見方もある。福島 [url=http://www.gatewaychurchsbc.org/]グッチ バッグ[/url] 転勤を受け入れられず、退職を選ぶ人もいるとみられる。ただ、厳しすぎる人事 策は社員士気を下げてしまう。福島に派遣される「元管理職」の給与は現在より上積 [url=http://www.gatewaychurchsbc.org/]グッチ アウトレット[/url] みされるようだが、彼らのやる気を失わせない工夫 [url=http://www.gatewaychurchsbc.org/]http://www.gatewaychurchsbc.org/[/url] も求められそうだ。

MCM 正規品 January 9th, 2014

You definitely made your point.

XtIXkguc4d January 9th, 2014

Souls in the Waves

Superior Morning, I just stopped in to go to your internet site and imagined I would say I enjoyed myself.

Awesome facts, Thank you!

コーチ 福袋 ネタバレ January 9th, 2014

Nicely put. Appreciate it.

Wow tons of useful info!

You actually mentioned this perfectly!

Truly plenty of helpful data.

Valuable forum posts, Many thanks.

You reported this adequately!

Parajumpers Jackets January 9th, 2014

Click on any tag to get a stream of tweets on that subject. If you’re lucky enough to enjoy a white Christmas,parajumpers outerwear,, you may also be plagued by slippery or icy roads and pavements when all that snow starts to melt. “As a former grains specialist I couldn’t agree with you less. It is important to know the pore sizes of this particular desiccant before you decide to put it to use. 00 The bag is a cassic of the Parajumpers Outlet tave bag coection,,Parajumpers Outlet,this smaest ve

parker 5th IM January 9th, 2014

Many thanks. I like it.

MCM 財布 新作 January 9th, 2014

You actually stated it terrifically!

ミュウミュウ 財布 January 9th, 2014

Wonderful info Kudos!

parker 5th January 9th, 2014

Awesome material, Appreciate it!

トゥミ バッグ January 9th, 2014

Cheers, Lots of stuff!

パーカー 万年筆 January 9th, 2014

Kudos! A lot of forum posts!

コーチ 長財布 January 9th, 2014

Valuable forum posts, Thanks a lot!

You actually said that wonderfully!

クロエ バッグ 人気 January 9th, 2014

Kudos! Ample data!

Kudos. A good amount of advice.

Many thanks! I like this!

マイケルコース 財布 January 9th, 2014

You actually explained that adequately!

ミュウミュウ 長財布 January 9th, 2014

Nicely put. Kudos!

chloe 公式 January 9th, 2014

Position certainly utilized!.

クロムハーツ 指輪 January 9th, 2014

Wow many of helpful facts.

フルラ バッグ 人気 January 9th, 2014

Whoa loads of good knowledge!

クロエ 財布 激安 January 9th, 2014

Fantastic stuff. With thanks!