ServerManager CommitChanges вносит изменения с небольшой задержкой

У меня небольшая проблема с классом ServerManager (из сборки Microsoft.Web.Administration), и я надеюсь, что некоторые из вас смогут мне помочь.

В основном мне нужно создать новое приложение внутри сайта (используя IIS 7.5) и перенаправить пользователя в новое приложение внутри того же события. Эта функция реализована внутри веб-приложения .net с использованием mvc 3/С#.

Вот мой код:

ServerManager iisManager = new ServerManager();
Site mySite = iisManager.Sites["mySitesName"];            
ApplicationCollection applications = mySite.Applications;

Application app = applications.Add(newapp, physicalPath);
app.ApplicationPoolName = "myAppPool";

iisManager.CommitChanges();                    
iisManager.Dispose();

return new RedirectResult("http://localhost/" + newapp);

Я думаю, что проблема с этим кодом заключается в том, что ServerManager, кажется, отправляет изменения с небольшой задержкой, а перенаправление на недавно добавленное приложение в IIS возвращает «Ошибка HTTP 404.0 - не найдено», потому что изменения, зафиксированные из ServerManager, не завершены (я думаю) . Если я обновлю страницу после ошибки 404, загрузится новое приложение.

Любая помощь или идея приветствуется.

Ваше здоровье!


person TestSubject    schedule 16.09.2011    source источник
comment
Перенаправить на страницу-заполнитель с таймером (или МЕТА-ОБНОВЛЕНИЕМ)? Затем перенаправить на новый сайт?   -  person Roger Lipscombe    schedule 16.09.2011
comment
Спасибо за предложение, это хороший обходной путь, но не совсем то, на что я надеялся. Я продолжу копать и вернусь с решением .... если я его найду. :)   -  person TestSubject    schedule 19.09.2011
comment
forums.iis.net/t/1181715.aspx   -  person Lex Li    schedule 20.09.2011
comment
привет, Лекс, еще раз спасибо :D   -  person TestSubject    schedule 28.09.2011
comment
Microsoft никогда не приходило в голову, что нам нужно блокировать, пока не произойдет изменение состояния. Использование этого API приведет к множеству состояний гонки, большому количеству Thread.Sleep и надежде на лучшее. Качество!   -  person Jack    schedule 06.09.2012


Ответы (1)


Кажется, что документацию об этой "задержке" очень трудно найти... или ее не существует. В конце концов я остановился на «Thread.Sleep», как было предложено на iis.net.

Надеюсь, это поможет другим нуждающимся.

Ваше здоровье!

person TestSubject    schedule 28.09.2011
comment
Thread.Sleep — это «хорошее» решение. Однако я решил просканировать servermanager и дождаться объектов, которые я только что создал, прежде чем пытаться их использовать. (В моем случае я устанавливал права доступа к папке для только что созданного пользователя IIS) - person kaspur; 08.12.2012
comment
Хотелось бы, чтобы был способ дождаться завершения фактических изменений. Thread.Sleep() может работать большую часть времени, а затем один раз дать сбой только потому, что сервер занят, и это занимает больше времени, что делает это решение ненадежным. Я предполагаю, что запуск цикла до тех пор, пока изменения не будут зафиксированы, вероятно, хорош. - person binki; 16.05.2018
comment
У меня была проблема, что после создания сайта serverManager.Sites[siteName].State выдавало ошибку. Я добавил цикл, который постоянно пытается получить доступ к этому свойству и прерывается по истечении времени ожидания или после исчезновения ошибки. Для этого одного запуска потребовалось 14 циклов или 400 мс, прежде чем сайт был готов. - person binki; 16.05.2018