Powershell через Ajax, возвращающий строку (или ничего) в .NET MVC проекте - PullRequest
0 голосов
/ 19 декабря 2018

Я работаю над приборной панелью, которая показывает в реальном времени подробности о наборе машин.У меня есть ниже для моего Powershell

param([string] $server)


    $services = Get-WmiObject win32_service -ComputerName $server | Select -Property  Name, ExitCode, State, Status
    $disk = get-WmiObject win32_logicaldisk -Computername $server | Select-Object -Property DeviceID, @{n="Size";e={[math]::Round($_.Size/1GB,2)}},@{n="FreeSpace";e={[math]::Round($_.FreeSpace/1GB,2)}} 
    $cpu = Get-WmiObject win32_processor -ComputerName $server | Measure-Object -property LoadPercentage -Average | Select Average


$server_summary = @{
    services = $services
    disk = $disk
    cpu = $cpu
}

$json = $server_summary | ConvertTo-Json

return $json

У меня есть ниже для моей функции c #

public JsonResult test (string server)
    {
        string script = ControllerContext.HttpContext.Server.MapPath("~/Content/Powershell/Get-Server-Summary.ps1");
        string cmd = script + " -server '" + server + "'";

        using (var ps = PowerShell.Create())
        {
            ps.AddScript(cmd);
            var results = ps.Invoke();


            return Json(results);
        }

    }

В разделе сценариев моего HMTL у меня есть

function test(server) {
        $.ajax({
            type: "POST",
            url: '@Url.Action("test")',
            dataType: "json",
            data: "{'server':" + "'" + server + "'}",
            contentType: "application/json; charset=utf-8",
            success: function (data) {


            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert('Error getting stats for ' + server + '.');
            },

            complete: function () {

            }
        });
    }
$(document).ready(function(){
   test('server_name');
});

Несмотря на то, что я преобразовал результат в JSON, прежде чем вернуться к результатам в приложении, я получил пустую строку.

Я что-то упустил?Я смог получить результаты с помощью немного другой функции, но она возвращает неверные результаты.

Я опубликую это в комментариях, потому что у меня слишком много кода для публикации моего вопроса ...

Результаты на стороне сервера выглядят следующим образом. enter image description here Вы видите, что я получаю один результат - строку, содержащую все json.

Было трудно получитьскриншот во времени.Но вы можете видеть, что значение там, Это просто ДЕЙСТВИТЕЛЬНО похоронено ... Мне действительно нужно проанализировать все это?Для этого уже нет функции?

enter image description here

1 Ответ

0 голосов
/ 20 декабря 2018

Ваш Сценарий PowerShell уже возвращает строку JSON из-за использования ConvertTo-Json.

. Как вы утверждаете, следующим шагом в вашем коде C # будет извлечь эту строку из экземпляра System.Collections.ObjectModel.Collection<System.Management.Automation.PSObject, который PowerShell.Invoke() возвращает :

 string json = ps.Invoke()[0].ToString();

Последний шаг - использовать эту строку как есть в качестве данных результата вашего метода, с помощью метода Content() - нет необходимо сначала десериализовать строку только для повторной сериализации с Json() method:

return Content(json, "application/json");

Обратите внимание, что вам придется изменить тип возвращаемого значения вашего метода с JsonResult на ContentResult.

Этот подход любезно предоставлен этот ответ .

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