Web Connection 6.0 Feature: New Project Server Configuration Script
October 09, 2015 •
In Web Connection 6.0 there's an updated project Wizard that creates a new 'project' for you that is self contained. Web Connection 6.0 projects copy all files into a single folder hierarchy where both the Web folder and the Deploy (code) folder are under the same root. The result of this structure is that we can now more easily move projects around, and just as importantly configure various folder paths using relative paths that won't have to change when a project is moved.
All of this makes it much easier to deploy projects by simply copying the entire structure to a new deployment location. The idea is to make it easier to configure a Web Connection application on the server by automating the server configuration with a few simple steps that you can perform before you deploy your application on the server.
A Server Configuration Script
When a new project is generated Web Connection creates among other files a YourApp_ServerConfig.prg file. This plain FoxPro code file contains a small bit of code that uses server configuration code provided with Web Connection to:
- Create a Virtual Directory for your Application
- Add to an Application Pool (Web Connection by default)
- Add Basic and Windows Authentication
- Create Script Maps for your Application
- Set Windows Permissions for your Application
Because the new project layout uses a known folder structure, Web Connection can use relative paths to find the Web folder, temp folder and script paths, so it's easy to pregenerate a configuration script. I chose to generate a separate PRG file rather than generate a pre-compiled EXE file simply because it makes it possible to add additional configuration tasks to this script. Rather than pre-compiling this allows you the option to build a custom build script that can perform much more sophisticated tasks (like create multiple virtuals or add additional users to the ACL list etc.).
A typical generated XXXXX_ServerConfig.prg file looks like this (generated for a project called WebTest2):
************************************************************************ * Webtest2_ServerConfig **************************************** *** Function: Templated Installation routine that can configure the *** Web Server for you from this file. *** *** You can modify this script to fit your exact needs *** *** Assume: Build this into an EXE file OR *** add as a command line option to your *** main application EXE (MyApp.exe "Configure") *** Pass: lcIISPath - IIS Configuration Path (optional) *** http://localhost/w3svc/1/root ************************************************************************ LPARAMETERS lcIISPath DO wwUtils SET CLASS TO WebServer ADDIT SET CLASSLIB TO wwXML ADdit *** Configurable settings lcVirtual = "WebTest2" lcScriptMaps = "wc,wcsx,wt2" lcVirtualPath = LOWER(FULLPATH("..\Web")) lcScriptPath = lcVirtualPath + "\bin\wc.dll" lcTempPath = LOWER(FULLPATH(".\temp")) lcApplicationPool = "WebConnection" lcServerMode = "IIS7HANDLER" && "IIS7" (ISAPI) IF EMPTY(lcIISPath) *** Typically this is the root site path lcIISPath = "IIS://localhost/w3svc/1/root" ENDIF loWebServer = CREATEOBJECT("wwWebServer") loWebServer.cServerType = UPPER(lcServerMode) loWebServer.cApplicationPool = lcApplicationPool IF !EMPTY(lcIISPath) loWebServer.cIISVirtualPath = lcIISPath ENDIF WAIT WINDOW NOWAIT "Creating virtual directory " + lcVirtual + "..." *** Create the virtual directory IF !loWebServer.CreateVirtual(lcVirtual,lcVirtualPath) RETURN ENDIF *** Create the Script Maps lnMaps = ALINES(laMaps,lcScriptMaps,1 + 4,",") FOR lnx=1 TO lnMaps lcMap = laMaps[lnX] WAIT WINDOW NOWAIT "Creating Scriptmap " + lcMap + "..." llResult = loWebServer.CreateScriptMap(lcMap, lcScriptPath) ENDFOR WAIT WINDOW NOWAIT "Setting folder permissions..." lcAnonymousUserName = "" loVirtual = GETOBJECT(lcIISPath) lcAnonymousUserName = loVirtual.AnonymousUserName loVirtual = .f. *** Set access on the Web directory SetAcl(lcVirtualPath,"SYSTEM","F",.t.) SetAcl(lcVirtualPath,"Administrators","F",.t.) SetAcl(lcVirtualPath,"NETWORKSERVICE","F",.T.) *** IUSR Anonymous Access IF !EMPTY(lcAnonymousUserName) llResult = SetAcl(lcVirtualPath,lcAnonymousUserName,"R",.t.) ENDIF *** Set access on the Temp directory SetAcl(lcTempPath,"SYSTEM","F",.t.) SetAcl(lcTempPath,"Administrators","F",.t.) SetAcl(lcTempPath,"NETWORK SERVICE","F",.T.) WAIT WINDOW Nowait "Configuration completed..."
It's pretty easy to see what's going on in this file, right? The configuration section is just a set of values specified at the top. The code then generates the virtual and scriptmaps and sets permissions.
This is a generated PRG file that gets created in your project root. Because it's just a PRG you can modify it and add additional configuration steps to this file. You can add additional folders to configure, addition accounts to add to the security or even do other configuration tasks like copy files from a network location or download some related dependency into the deploy folder. It's entire open to you.
If you're using older projects you can still use this file and modify it to reflect your file locations explicitly in the configuration section.
Requires that IIS is installed and you have Admin Privileges
To be clear, this functionality configures IIS for your application, but you need to make sure that IIS is installed with the proper components first.
Note: IIS has to be installed and configured properly
The base IIS install has to be up and running on the machine and configured properly before this will work. You can find out more on how to configure IIS on recent versions of Windows.Note: Admin Privileges requires
In order to configure IIS you have to be a full Administrator so you need to run a compiled EXE or the VFP IDE as an administrator in order for IIS configuration to work.
Running the Setup script
You can run this script from the FoxPro dev environment (make sure the Web Connection libraries are referenced):
DO WebTest2_SetupConfig.prg
remember if you do this inside of VFP's IDE make sure you started it as an Admin.
Embedded into your Server
The generated script however is also embedded into your Web Connection server via a command line parameter. When you create a new project now your MAIN prg file is generated with a few parameters at the top and a little added code that calls out to the _SetupConfig file when a 'config' command argument is passed to the EXE:
************************************************************************ *FUNCTION Webtest2Main ****************************** *** Created: 10/09/2015 *** Function: Web Connection Mainline program. Responsible for setting *** up the Web Connection Server and get it ready to *** receive requests in file messaging mode. ************************************************************************ LPARAMETERS lcAction, lvParm1, lvParm2 *** This is the file based start up code that gets *** the server form up and running #INCLUDE WCONNECT.H *** PUBLIC flag allows server to never quit *** - unless EXIT button code is executed RELEASE goWCServer SET TALK OFF SET NOTIFY OFF *** Load the Web Connection class libraries IF FILE("WCONNECT.APP") DO ("WCONNECT.APP") ELSE DO WCONNECT ENDIF IF VARTYPE(lcAction) = "C" AND StartsWith(LOWER(lcAction),"config") do WebTest2_ServerConfig.prg with lvParm1 RETURN ENDIF *** Load the server - wc3DemoServer class below goWCServer = CREATE("Webtest2Server") IF !goWCServer.lDebugMode SET DEBUG OFF SET STATUS BAR OFF SET DEVELOP OFF SET SYSMENU OFF ENDIF IF TYPE("goWCServer")#"O" =MessageBox("Unable to load Web Connection Server",48,; "Web Connection Error") RETURN ENDIF *** Make the server live - Show puts the server online and in polling mode READ EVENTS
When you now compile your Web Connection server into an EXE you'll have an option 'Config' command line switch that you can use to trigger the configuration process:
WebTest2.exe config
This will also trigger the configuration code to run.
There's a second commanline option you can apply providing an IIS meta base path (if you're configuring non-default Web site or virtual as a base):
WebTest2.exe config "IIS://localhost/w3svc/2/root"
which configures a different Web site (site with the ID of 2).
Running the utility should be very quick and only take a few seconds. You should see a couple WAIT WINDOWs flash by and then you're done.
If you want to double check whether things worked check:
- Whether the virtual was created in IIS Manager
- Whether the Script Maps were created in IIS Manager
- Permissions in the Web and Temp folders
It's the little Things!
Configuration of the Web server continues to be a struggle for a lot of Web Connection developers and I hope this feature makes it a little easier to get your server configured in a repeatable way. I think this script generation accomplishes two things: It makes the process easier to apply and maintain, but it also takes some of the mystery out of the Web server configuration. You now have a piece of code that actually tells you what it's doing and you can control and modify the behavior as you see fit.
With the new project changes it's gotten vastly easier to copy project files by simply 'xcopy deploying' your application. This setup script can then take a standard installation and create all the basic Web server specific configuration settings and create them for you.
The Web Connection 6.0 beta is available now to registered users of Web Connection 5.5 and later, or you can purchase an upgrade from our Web store. During the beta period we have 15% discount on upgrades.