Мне не нравится генерация кода, используемая в большей части ORMs. На самом деле, генерация кода в целом, которую я нахожу, чтобы быть слабым инструментом, который обычно показателен из использования неправильного языка во-первых.
В особенности с отражением .NET, я не вижу потребности в генерале кода в целях ORM.
Если вы используете IIS 7, есть новый управляемый API под названием Microsoft.Web.Administration
Пример из приведенного выше сообщения в блоге:
ServerManager iisManager = new ServerManager();
iisManager.Sites.Add("NewSite", "http", "*:8080:", "d:\\MySite");
iisManager.CommitChanges();
Если вы ' Если вы используете IIS 6 и хотите это сделать, это, к сожалению, более сложно.
Вам нужно будет создать веб-службу на каждом сервере, веб-службу, которая обрабатывает создание веб-сайта, потому что прямое олицетворение пользователя по сети не будет работать должным образом (если я правильно помню).
Вы будете должны использовать Interop Services и делать что-то подобное (в этом примере используются два объекта, сервер и сайт, которые являются экземплярами настраиваемых классов, которые хранят конфигурацию сервера и сайта):
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;
Подробнее см. здесь
Попробуйте следующий код, чтобы узнать неиспользуемый портно
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;