Переработка пула приложений на IIS6 с использованием C # - PullRequest
1 голос
/ 18 февраля 2011

Я пытаюсь программно перезапустить пул приложений на IIS6 через веб-приложение. Я искал по всей сети и нашел кучу решений (большинство из которых включают в себя олицетворение), но ни одно из них, похоже, не работает. Самая распространенная ошибка, которую я получаю, - это E_ACCESSDENIED, несмотря на ввод действительного имени пользователя и пароля. Кто-нибудь может указать мне правильное направление?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2011

Решение, которое я использую для такого рода вещей (когда вы пытаетесь запустить процесс из ASP.NET, которому требуются права администратора), заключается в следующем:

  1. Пишите все, что вам нужно, какСамостоятельная служба WCF.Желательно, чтобы служба REST Http, чтобы ее можно было легко вызвать (даже используя для проверки только браузер)
  2. Убедитесь, что ваша служба запущена с использованием учетной записи администратора.Вы можете использовать планировщик задач, чтобы убедиться, что служба работает постоянно, а также запускаться с использованием учетной записи администратора.
  3. Выполнять методы в службе из приложения ASP.NET с помощью клиента WCF

И это работает постоянно, независимо от того, какой «процесс» я пытаюсь запустить из приложения ASP.NET.

Теперь, что касается деталей (кода), позвольте мнезнать, если вам нужна помощь.Приведенный ниже код - это код, который вы бы использовали в консольном приложении, чтобы сделать его самостоятельно размещенной службой WCF.

В этом случае это служба Http, прослушивающая порт 7654.

static void Main(string[] args)
{
  var webServiceHhost = new WebServiceHost(typeof(AppCmdService), new Uri("http://localhost:7654"));
  ServiceEndpoint ep = webServiceHhost.AddServiceEndpoint(typeof(AppCmdService), new WebHttpBinding(), "");
  var serviceDebugBehavior = webServiceHhost.Description.Behaviors.Find<ServiceDebugBehavior>();
  serviceDebugBehavior.HttpHelpPageEnabled = false;
  webServiceHhost.Open();
  Console.WriteLine("Service is running");
  Console.WriteLine("Press enter to quit ");
  Console.ReadLine();
  webServiceHhost.Close(); 
}

AppCmdService - это класс службы WCF, который выглядит следующим образом (в моем случае).В вашем случае вам, вероятно, не нужен ответ от вашего сервиса.В моем случае я получаю ответ от Json.Реальная реализация того, что вы пытаетесь сделать, очевидно, будет другой.Но я предполагаю, что у вас уже есть этот кусок.Так что просто вызовите метод этого класса отсюда.

  [ServiceContract]
  public class AppCmdService
  {
    [WebGet(UriTemplate = "/GetCurrentExcutingRequests/?", ResponseFormat= WebMessageFormat.Json)]
    [OperationContract]
    public IEnumerable<ExecutingRequestJson> GetCurrentExcutingRequests()
    {      
      return CurrentExecutingRequestJsonProvider.GetCurrentExecutingRequests("localhost");
    }
  }

На вашей стороне ASP.NET вам на самом деле не нужен клиент WCF.Все, что вам нужно, это способ сделать http-вызов в службу.Таким образом, вы можете просто использовать HttpWebRequest для вызова вашего сервиса, который, в свою очередь, выполнит ваш процесс.

Надеюсь, все это имеет смысл?

0 голосов
/ 18 февраля 2011

Может быть, этот ТАК вопрос поможет вам. Существует несколько решений (также для IIS6):

ИМХО, лучшее, что вы могли бы сделать, - это выбрать конкретный подход, а затем, когда вы столкнетесь с исключением, задать конкретный вопрос с исходным кодом вашего подхода. В противном случае просто очень смело отвечать на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...