Abstract
This application illustrates an installer that changes the values in a webservice's web.config file during setup, according to user entry. The application changes values of key values in the web.config file.
Explanation
As web.config is a configuration file for ASP.NET applications or ASP.NET web service applications to store data, it can be modified by the user after application setup using Notepad or programmatically. Most programmers use web.config as it stored data that can be changed dynamically by the user.
<appSettings>
<add key="Name" value="Keyvalue"/>
</appSettings>
A user might have to open and change this file many times if a web application or service is moved from one server to another frequently, so in the installer I've enabled a facility for a user to change the values of attributes of his choice.
My example in this application changes the connection string used by a web service.
<appSettings>
<add key="Main.ConnectionString"
value="server=(local);database=DatabaseName;
User ID=sa;Password=;
trusted_connection=false"/>
</appSettings>
So in the installer, I change the key value by implementing the installer class in a webservice project.
Then in the installer class, I override the Install
function:
public override void Install(IDictionary stateSaver)
{
CreateConnectionString();
base.Install (stateSaver);
}
To get data required to change the values in web.config from the user, I add in the setup project, a custom action:
I the change custom data property for it to:
/Server=[EDITA1]@/Username=
[EDITA2]@/Password=[EDITA3]@/Folder=[EDITA4]
[EDITA1]
, [EDITA2]
, [EDITA3]
, [EDITA4]
are names of textboxes in the dialog added in the setup project interface.
You will notice the value here:
/Server=[EDITA1]@/Username=[EDITA2]@/Password=[EDITA3]@/Folder=[EDITA4]
I've separated the parameters to the Installer
class by a special letter (@) to split them later as Visual Studio concatenates all the parameters to the first parameter and empty others.
void FormateParamters()
{
string strServer,strUser , strPassword ,strFolder;
EventLog.WriteEntry("TNT", Context.Parameters["Server"]);
strServer=Context.Parameters["Server"].Split('@')[0];
strUser=Context.Parameters["Server"].Split('@')[1];
strPassword=Context.Parameters["Server"].Split('@')[2];
strFolder=Context.Parameters["Server"].Split('@')[3];
Context.Parameters["Server"]=strServer;
Context.Parameters["Username"]=strUser.Split('=')[1];
EventLog.WriteEntry("user",Context.Parameters["Username"]);
Context.Parameters["Password"]=strPassword.Split('=')[1];
EventLog.WriteEntry("Password",Context.Parameters["Password"]);
Context.Parameters["Folder"]=strFolder.Split('=')[1];
EventLog.WriteEntry("folder",Context.Parameters["Folder"]);
EventLog.WriteEntry("Server",Context.Parameters["Server"]);
}
The previous function is to format the parameters by splitting them using the special character (@) so we can use them later for the connection string reconstruction function:
void CreateConnectionString()
{
FormateParamters();
Assembly ass=Assembly.GetExecutingAssembly();
EventLog.WriteEntry ("Web.Config",
ass.GetName().Name+".Web.config");
Stream stmConfig=ass.GetManifestResourceStream(
ass.GetName().Name+".Web.config");
if(!Directory.Exists(Context.Parameters["Folder"]))
Directory.CreateDirectory(Context.Parameters["Folder"]);
FileStream stmPhysical=new FileStream(
Context.Parameters["Folder"]+@"\Web.config",
FileMode.Create);
StreamReader srConfig=new StreamReader(stmConfig);
StreamWriter swConfig=new StreamWriter(stmPhysical);
string strConfig=srConfig.ReadToEnd();
stmConfig.Close();
strConfig=strConfig.Replace("server=(local);database" +
"=DatabaseName;User ID=sa;Password=;" +
"trusted_connection=false",NewConnection());
swConfig.Write(strConfig);
swConfig.Close ();
stmPhysical.Close();
}
The above function copies the web.config from the physical path and begins to replace the old key value with the new value.
Note: the local folder parameter must be the same path where the webservice is installed in. In this case, it is:
C:\intpub\wwwroot\webtest1\