Использование MSDeploy API для получения зависимостей веб-сервера - PullRequest
2 голосов
/ 13 марта 2011

Я только начинаю понимать API C # для MSDeploy (Microsoft.Web.Deployment.dll), но я изо всех сил пытаюсь найти способ определения зависимостей для данного веб-сервера.

По сути, я хотел бы получить эквивалент C # следующего вызова командной строки MSDeploy:

msdeploy.exe -verb:getDependencies -source:webServer

Я пробовал документацию , но у меня былонеудачно.Кто-нибудь может указать мне правильное направление?

Ответы [ 2 ]

5 голосов
/ 14 марта 2011

Изучив исполняемый файл MSDeploy в Reflector, кажется, что операция getDependencies не предоставляется API (метод является внутренним).

Поэтому вместо этого мне пришлось прибегнуть к вызовукомандная строка и обработка результатов:

static void Main()
    {
        var processStartInfo = new ProcessStartInfo("msdeploy.exe")
            {
                RedirectStandardOutput = true,
                Arguments = "-verb:getDependencies -source:webServer -xml",
                UseShellExecute = false
            };

        var process = new Process {StartInfo = processStartInfo};
        process.Start();

        var outputString = process.StandardOutput.ReadToEnd();

        var dependencies =  ParseGetDependenciesOutput(outputString);

    }

    public static GetDependenciesOutput ParseGetDependenciesOutput(string outputString)
    {
        var doc = XDocument.Parse(outputString);
        var dependencyInfo = doc.Descendants().Single(x => x.Name == "dependencyInfo");
        var result = new GetDependenciesOutput
            {
                Dependencies = dependencyInfo.Descendants().Where(descendant => descendant.Name == "dependency"),
                AppPoolsInUse = dependencyInfo.Descendants().Where(descendant => descendant.Name == "apppoolInUse"),
                NativeModules = dependencyInfo.Descendants().Where(descendant => descendant.Name == "nativeModule"),
                ManagedTypes = dependencyInfo.Descendants().Where(descendant => descendant.Name == "managedType")
            };
        return result;
    }

    public class GetDependenciesOutput
    {
        public IEnumerable<XElement> Dependencies;
        public IEnumerable<XElement> AppPoolsInUse;
        public IEnumerable<XElement> NativeModules;
        public IEnumerable<XElement> ManagedTypes;
    }

Надеюсь, это полезно для всех, кто когда-либо пытался сделать то же самое!

3 голосов
/ 03 мая 2011

На самом деле есть способ попасть туда через публичный API, используя DeploymentObject.Invoke (string methodName, params object [] parameters) .

Когда для methodName используется метод getDependencies, метод возвращает объект XPathNavigator :

    DeploymentObject deplObj = DeploymentManager.CreateObject(DeploymentWellKnownProvider.WebServer, String.Empty);
    var result = deplObj.Invoke("getDependencies") as XPathNavigator;
    var xml = XDocument.Parse(result.InnerXml);
...