site - Crear mediante programación un sitio web en IIS utilizando C#y establecer el número de puerto
crear sitio web iis windows server 2008 (4)
- En las propiedades del sitio, seleccione la pestaña "Sitio web" y especifique el puerto TCP.
- En estudio para depurar el propósito, especifique http://localhost:<port>/<site> ; en la pestaña Web para "Usar servidor web IIS local"
Hemos sido capaces de crear un sitio web. Lo hicimos usando la información en este enlace:
https://msdn.microsoft.com/en-us/library/ms525598.aspx
Sin embargo, nos gustaría utilizar un número de puerto distinto al puerto 80. ¿Cómo hacemos esto?
Estamos usando IIS 6
Aquí está la solución.
Artículo del blog: Cómo agregar un nuevo sitio web en IIS 7
Al hacer clic en el botón:
try
{
ServerManager serverMgr = new ServerManager();
string strWebsitename = txtwebsitename.Text; // abc
string strApplicationPool = "DefaultAppPool"; // set your deafultpool :4.0 in IIS
string strhostname = txthostname.Text; //abc.com
string stripaddress = txtipaddress.Text;// ip address
string bindinginfo = stripaddress + ":80:" + strhostname;
//check if website name already exists in IIS
Boolean bWebsite = IsWebsiteExists(strWebsitename);
if (!bWebsite)
{
Site mySite = serverMgr.Sites.Add(strWebsitename.ToString(), "http", bindinginfo, "C://inetpub//wwwroot//yourWebsite");
mySite.ApplicationDefaults.ApplicationPoolName = strApplicationPool;
mySite.TraceFailedRequestsLogging.Enabled = true;
mySite.TraceFailedRequestsLogging.Directory = "C://inetpub//customfolder//site";
serverMgr.CommitChanges();
lblmsg.Text = "New website " + strWebsitename + " added sucessfully";
}
else
{
lblmsg.Text = "Name should be unique, " + strWebsitename + " is already exists. ";
}
}
catch (Exception ae)
{
Response.Redirect(ae.Message);
}
Looping sobre sitios si el nombre ya existe
public bool IsWebsiteExists(string strWebsitename)
{
Boolean flagset = false;
SiteCollection sitecollection = serverMgr.Sites;
foreach (Site site in sitecollection)
{
if (site.Name == strWebsitename.ToString())
{
flagset = true;
break;
}
else
{
flagset = false;
}
}
return flagset;
}
Pruebe el siguiente código para conocer el puerto no utilizado.
DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC");
// Find unused ID PortNo for new web site
bool found_valid_port_no = false;
int random_port_no = 1;
do
{
bool regenerate_port_no = false;
System.Random random_generator = new Random();
random_port_no = random_generator.Next(9000,15000);
foreach (DirectoryEntry e in root.Children)
{
if (e.SchemaClassName == "IIsWebServer")
{
int site_id = Convert.ToInt32(e.Name);
//For each detected ID find the port Number
DirectoryEntry vRoot = new DirectoryEntry("IIS://localhost/W3SVC/" + site_id);
PropertyValueCollection pvcServerBindings = vRoot.Properties["serverbindings"];
String bindings = pvcServerBindings.Value.ToString().Replace(":", "");
int port_no = Convert.ToInt32(bindings);
if (port_no == random_port_no)
{
regenerate_port_no = true;
break;
}
}
}
found_valid_port_no = !regenerate_port_no;
} while (!found_valid_port_no);
int newportId = random_port_no;
Si está utilizando IIS 7, hay una nueva API administrada llamada Microsoft.Web.Administration
Un ejemplo de la publicación de blog anterior:
ServerManager iisManager = new ServerManager();
iisManager.Sites.Add("NewSite", "http", "*:8080:", "d://MySite");
iisManager.CommitChanges();
Si está utilizando IIS 6 y desea hacer esto, lamentablemente es más complejo.
Deberá crear un servicio web en cada servidor, un servicio web que maneje la creación de un sitio web porque la suplantación directa del usuario a través de la red no funcionará correctamente (si recuerdo esto correctamente).
Tendrá que usar Interop Services y hacer algo similar a esto (este ejemplo usa dos objetos, servidor y sitio, que son instancias de clases personalizadas que almacenan la configuración de un servidor y del sitio):
string metabasePath = "IIS://" + server.ComputerName + "/W3SVC";
DirectoryEntry w3svc = new DirectoryEntry(metabasePath, server.Username, server.Password);
string serverBindings = ":80:" + site.HostName;
string homeDirectory = server.WWWRootPath + "//" + site.FolderName;
object[] newSite = new object[] { site.Name, new object[] { serverBindings }, homeDirectory };
object websiteId = (object)w3svc.Invoke("CreateNewSite", newSite);
// Returns the Website ID from the Metabase
int id = (int)websiteId;
Ver más here