Walkthrough: Redirecting an Application to Target a Different Web Service at Installation
This walkthrough demonstrates how to create a Web application that can be redirected to target a different Web service by using the URL Behavior property, an Installer class, and a Web Setup project. This is useful when you need to target a Web service locally during development and want to use a production version of the Web service when your application is deployed.
Your computer might show different names or locations for some of the Visual Studio user interface elements in the following instructions. The Visual Studio edition that you have and the settings that you use determine these elements. For more information, see Visual Studio Settings.
Creating the Web Application Project
The first step is to create an ASP.NET Web Application project that contains a Web reference to a Web service.
To create the project
- Create a Web application that has a Web reference to a Web service. A Web reference to any valid Web service will suffice for this walkthrough.
Adding an Installer Class
Installer classes, also known as installation components, are .NET Framework classes invoked as custom actions during installation. In this case, you will add a class library project to the solution. In that class library project, you will create an Installer class and override its Install method, adding code to modify the Web application's .config file.
To create the class library project
Right-click the solution node in Solution Explorer and click Add, then New Project.
In the Add New Project dialog box, in the Visual Basic node, select Class Library.
Name the project InstallerClassLibrary.
To add and implement an Installer class
Right-click the InstallerClassLibrary project node in Solution Explorer and click Add, then Class.
In the Add New Item dialog box, select Installer Class and change the Name to WebServiceInstaller.vb.
When you click Add, the class will be added to the project and the designer for the Installer class will open.
Double-click the designer to open the Code Editor.
In WebServiceInstaller.vb, add the following code at the bottom of the Installer class module (just above the End Class declaration); this code implements the Install method:
Public Overrides Sub Install( ByVal stateSaver As System.Collections.IDictionary) ' Gets the parameter passed across in the CustomActionData. Dim install_log As New System.IO.StreamWriter("Installation.log") install_log.AutoFlush = True Try Dim providedName = Me.Context.Parameters.Item("ServerName") Dim svcName = Me.Context.Parameters.Item("ServiceName") install_log.WriteLine("Starting Edit of the config file") If providedName = "" OrElse svcName = "" Then Throw New InstallException("No arguments specified") End If ' Uses reflection to find the location of the config file. Dim strConfigLoc = System.Reflection.Assembly.GetExecutingAssembly().Location Dim strTemp = strConfigLoc strTemp = strTemp.Remove(strTemp.LastIndexOf("\"), Len(strTemp) - strTemp.LastIndexOf("\")) strTemp = strTemp.Remove(strTemp.LastIndexOf("\"), Len(strTemp) - strTemp.LastIndexOf("\")) Dim fInfo As New System.IO.FileInfo(strTemp & "\web.config") install_log.WriteLine("File info: " & strTemp) If Not fInfo.Exists Then Throw New InstallException("Missing config file") End If ' Loads the config file into the XML DOM. ' Loads the config file into the XML DOM. Dim xmlDoc = XDocument.Load(fInfo.FullName) ' Finds the right node and change it to the new value. Dim foundIt As Boolean = False For Each node In xmlDoc.<configuration>.<appSettings>.<add> If node.@key = "servername.service" Then ' Note that "Service1.asmx" should be replaced with the ' actual name of the XML Web service file. node.@value = "http://" & providedName & "/" & svcName & "/Service1.asmx" foundIt = True End If Next node If Not foundIt Then Throw New InstallException("Config file did not contain a ServerName section") End If ' Writes out the new config file. xmlDoc.Save(fInfo.FullName) Finally install_log.WriteLine("Ending edit of config file") install_log.Close() End Try End Sub
The above code first creates an installation log file that will record the progress of the custom action. The System.Reflection namespace is used to locate the assembly that is being installed and to find the associated .config file. The XML document model is used to iterate through the .config file until the appSettings section is found. When the key servername.service is found, its associated value is changed to include the parameters that were passed in, redirecting the application to use the new Web service.
In Solution Explorer, double-click the Web.config file to open it.
Copy the value of the key for your Web service in the appSettings section. The key takes the form servername.service where servername is the server where the Web service is located, and service is the name of the Web service.
Open the Installer class module in the Code Editor and replace the text "servername.service" with the value that you copied in the previous step.
Adding a Web Setup Project
Setup projects are used to create an installer for your application. Based on Windows Installer technology, setup projects include features such as the ability to run custom actions during installation and to customize the installation user interface. For more information on Setup projects, see Deploying Applications and Components.
To add a Web Setup project
Right-click the solution node in Solution Explorer and click Add, then New Project.
In the Add New Project dialog box, in the Project Types pane, expand the Other Project Types node, then select the Setup and Deployment Projects node.
In the Templates pane, select Web Setup Project. In the Name box, name the project WebAppSetup.
When you click OK, the project will be added to the solution and the File System Editor will be opened.
In the Properties window, select the ProductName Property and set it to the name of your Web application.
In the File System Editor, select the Web Application Folder.
On the Action menu, point to Add, then click Project Output.
In the Add Project Output Group dialog box, select InstallerClassLibrary from the Project drop-down list; then select Primary Output.
When you click OK, the primary output from InstallerClassLibrary will be added to the Web Setup project.
Adding a Custom Action
Custom actions are used to run code at the end of an installation in order to perform actions that cannot be handled during installation. The code for a custom action can be contained in a .dll, .exe, script, or assembly file. For more information on custom actions, see Custom Actions Management in Deployment.
To add the Installer class as a custom action
In Solution Explorer, select the WebAppSetup project.
On the View menu, click Editor, then Custom Actions.
The Custom Actions Editor opens.
In the Custom Actions Editor, select the Install node.
On the Action menu, choose Add Custom Action.
Double-click the Web Application Folder, then select Primary output from InstallerClassLibrary (Active).
In the Properties window, make sure that the InstallerClass property is set to True.
Select the CustomActionData property and enter the following text: /ServerName=[EDITA1] /ServiceName=[EDITA2]
The CustomActionData property provides the two parameters that are passed to the custom action, separated by a space.
Adding a Dialog Box
User interface dialog boxes are displayed during installation to collect information from the user. For more information on user interface dialogs, see User Interface Management in Deployment.
To add a custom user interface dialog box
In Solution Explorer, select the Setup project.
On the View menu, point to Editor, and then click User Interface.
In the User Interface Editor, select the Start node under Install.
On the Action menu, choose Add Dialog.
In the Add Dialog dialog box, choose the Textboxes (A) dialog and click OK.
On the Action menu, choose Move Up, and repeat until the Textboxes (A) dialog is located above the Installation Address dialog.
In the Properties window, set the following properties:
Enter the server name and service name
LocalhostNoteThis specifies a default server. You can enter your own default server name here.
<name of the service>
Notice that the Edit1Property property is set to "EDITA1" and the Edit2Property property is set to "EDITA2". These correspond with the values that you entered in the CustomActionData property in the Custom Actions Editor. When the user enters text in these edit controls during installation, the values are automatically passed by means of the CustomActionData property.
Building and Deploying the Application
The final step is to build the Setup project in order to create the installer, then to install your application on the target server.
To build the Setup project
- On the Build menu, choose Build Projectname, where Projectname is the name of your Setup project.
To deploy the application to a Web server on your development computer
In Solution Explorer, select your Setup project.
On the Project menu, click Install.
To deploy the application to a Web server on another computer
In Windows Explorer, navigate to your project directory and find the built installer. The default path will be \documents and settings\yourloginname\My Documents\Visual Studio Projects\setupprojectname\project configuration\productname.msi. The default project configuration is Debug.
Copy the .msi file and all other files and subdirectories in the directory to the Web server computer.
On the Web server computer, double-click the Setup.exe file to run the installer.