XIV – New ISAPI implementation in 14.0.53
New ISAPI implementation in IntraWeb 14.0.53
New IntraWeb 14.0.53 brings a new, rewritten from scratch, ISAPI implementation which is much faster than before. The new implemenation is not based on WebBroker, i.e. it does not use TWebRequest/TWebResponse built-in classes which imposes several problems and limitations for us.
First, during the years, many bugs of WebBroker had to be fixed inside IntraWeb code, using non-trivial techniques like memory patching of buggy code. Last IW version 15.0.53 implemented fixes for 3 different WebBroker bugs, which were reported to Embarcadero. Even when/if Embarcadero fixes the reported bug, we still have to implement a workaround for older versions, because we currently support 12 different Delphi and C++ Builder versions, both in x32 and x64.
Second, many aspects of WebBroker implementation won’t let us extend or modify its default behavior. Many methods and fields are private, or they are not virtual. This makes things really challenging. Any bug found forces us to patch WebBroker methods using some non-standard techniques.
Third, Delphi 10.1 Berlin ISAPI implementation was severely modified. Until Delphi 10 Seattle, HTTPApp.pas unit was mostly based on AnsiStrings. New Delphi 10.1 Berlin changed that to unicode Strings, which is a good thing. However, this alone would force us to have 2 different wrapper classes (or a single unit full of IFDEFS) in order to support 12 different Delphi versions.
We then decided to write our own ISAPI layer, free from WebBroker limitations and issues. It is much faster, uses lots of nice tricks internally to improve performance and now we have FULL control of every layer of our ISAPI implemenation.
New units were introduced: IW.ISAPI.Extension.pas (the main ISAPI implementation) and IW.ISAPI.ThreadPool.pas (replaces the standard Delphi ISAPIThreadPool unit).
If you have a IntraWeb application ready you will have to modify it. It is not difficult though. You should remove these units from your .DPR file:
- ISAPIThreadPool (if your application uses the ISAPI Thread Pool)
and add this unit:
- IW.ISAPI.ThreadPool (if your application uses the ISAPI Thread Pool). Please notice that this unit has to be after unit IWInitISAPI in your .DPR file
All ISAPI projects must contain unit IWInitISAPI.
Click here to be redirected to the download page.