The views expressed on this weblog are mine alone and do not necessarily reflect the views of my employer.
 Tuesday, November 26, 2002

Been doing some Web Gardening lately, and I'm disappointed at the lack of documentation on this supposedly powerful option for ASP.NET.  If I'm using a Quad-Proc Box and an ASP.NET Application that as some time is calling (via Interop) an inproc free-threaded C++ COM Component that then does some opereations and a (legacy) DCOM call out to another box, you'd think that having MaxWorkerThreads (per CPU) at some number x where 25<x<75 would be reasonable thing.  I would assume that a DCOM call (or Web Service call) would count as "waiting for an external resource" and that a few extra threads, and certainly a worker process per CPU would be ideal.  Per MSDN:

"If your application uses a slow database server or calls COM objects that have external dependencies, to name only a couple of possibilities, it can be beneficial to enable Web gardening for your application."

Certainly, this is vague at best.  Of course, everyone has seen the decks with one slide that mention Web Gardening, as well as books that spend a sentence on Web Gardening.  How do these ASPNET_WP.exe worker processes really behave?  I would presume it's as if one box becomes four...separate Cache Objects, separate Application objects. 

With Web Gardening, I'm seeing ASPNET_WP processes recycling constantly, and CoCreateInstance calls to my legacy DLLs failing.  However, without Web Gardening, things are peachy keen, and 30-50% better performance.

  • What are the ramifications for legacy COM and DOM calls within ASP.NET Worker Processes within a Garden?
  • Is Web Gardening just one of those many tweaks you give a try? 

Before this exercise, Web Gardening was an option in my architectural quiver...now (as it's not behaving at ALL like I'd have though) I'm not sure.

I'd had similar trouble in the past trying to tune MaxIoThreads and MaxWorkerThreads.  I had an ASP.NET application that was calling out to 2 or 3 Web Services, and when the system was under significant load, it would crap out - It was actually unable to get a free thread (from the system's thread pool I assume) to even get out of the box.  I was getting errors in the Socket Class, in the bowels of WebRequest.  Seemed that the box was SO busy dealing with the multiplicity of calls coming in (that were fanning out into n*2 outbound calls - ya, I know...) that it couldn't make the calls out...everyone blocked. (I even wondered if this was a nageling issue...or perhaps the HTTP stack not wanting too many calls (>2 [section 8.1.4]) out to the same server? ) And changing MaxIoThreads and MaxWorkerThreads from ANYTHING but the default of 25 was useless. 

  • Would it have been better to have written my own reserved thread pool and made the calls from there? 
  • Calling back to the Web Gardening problem...in the interest of throughput, should the calls to the COM object (that then calls out via DCOM to others) be made via my own worker thread pool? 
  • Or perhaps, from a COM+ application (That's what Clemens suggested).

These are the things that are currently disturbing my sleep...


Updated Link to this post 11:52:18 PM  #    comment []  trackback []

Automated Testing .NET Web Services and Applications

I just found Jim Klopfenstein's Executing ASMX files without a web server article. Jim's code could simplify most Web Service unit testing. And since it doesn't need IIS, or even ASP.NET, it would be easy to run during automated builds. Jim doesn't say, but I wouldn't be surprised if this is the reason he was trying to get this working.
I haven't thought much about it but you should be able to do the same thing for ASPX files. Has someone already done this?
[matt.griffith]

Interesting!  I knew that Cassini  (the ASP.NET "Host ASPNET_WP.EXE yourself" sample) and Web.Hosting, once "discovered", would cause good things to be built.  I'm sure if this was combined with my friend Jim Little's NUnitASP it could all be run within a NAnt automated build.

I wonder how hard it would be to insert an .NET interception layer/proxy server in between a Web Browser and ASP.NET to record the HTTP GETs and POSTs into a simple XML "recorder" file.  These could then be played back as part of an NUnit/NUnitASP Test and added to the build.  Regular expressions and and maybe an SGMLReader, also stored in the XML could validate the reponses...then I could stop using LoadRunner or SilkPeformer...

Has this app already been written? 


Updated Link to this post 10:59:07 PM  #    comment []  trackback []

Good article and primary on the basics of Cryptography and .NET.

"Mark Strawmyer provides an overview of cryptography, covers the basics on some of what's available through the .NET Framework, and then focuses on the use of symmetric encryption to protect data such as user passwords."


Updated Link to this post 3:09:46 PM  #    comment []  trackback []