C# 在.NET MVC项目中通过Ajax返回字符串(或不返回任何内容)的Powershell

C# 在.NET MVC项目中通过Ajax返回字符串(或不返回任何内容)的Powershell,c#,.net,json,ajax,powershell,C#,.net,Json,Ajax,Powershell,我正在制作一个仪表板,它显示了一组机器的实时细节。 下面是我的Powershell param([string] $server) $services = Get-WmiObject win32_service -ComputerName $server | Select -Property Name, ExitCode, State, Status $disk = get-WmiObject win32_logicaldisk -Computername $server

我正在制作一个仪表板,它显示了一组机器的实时细节。 下面是我的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,我仍会收到一个空字符串

我错过什么了吗?我能够使用稍微不同的函数得到结果,但它返回的结果不正确

我将在评论中发布,因为我有太多的代码来发布我的问题

服务器端的结果如下所示。 您可以看到,我得到了一个结果,这是一个包含所有json的字符串

很难及时得到截图。但是你可以看到它的价值就在那里,它真的被掩埋了。。。我真的需要解析所有这些吗?已经没有这个函数了吗


由于使用了
转换为JSON
,您的PowerShell脚本已经返回了一个JSON字符串


如您所述,在C#代码中的下一步是
System.Collections.ObjectModel.Collection
foreach(var result in results){output=result.ToString()}
中提取该字符串。调试时,我的C#函数返回不正确的结果,服务器端代码中的
results
包含哪些内容?PowerShell操作是否完全异步?能否将
结果
转换为简单的自定义类型并返回该对象?在浏览器的调试工具中,从服务器返回的原始内容是什么?@David我已经添加到了Q中。但为了澄清我确实得到了“正确”的结果,它只是从JSON转换成了一个字符串。但我把它改了两次,还是有问题?我在Powershell中转换了一次JSON,然后在通过ajax将其传回之前转换了一次。问题是,在响应客户端中得到的是一个空字符串,但最后一条注释表明得到的是一个JSON数据字符串。是哪一个?至于“转换两次”,那没有多大意义。听起来像是由
ps.Invoke()
返回的对象可能并不完全是您所期望的对象,一种很好的方法(以及防止不必要的数据被API暴露)是创建一个简单的对象(甚至是匿名对象),它只返回您希望从API返回的内容。这可能值得一试。您的PowerShell脚本返回的已经是JSON文本,因此您不应该将其传递给
JSON()
构造函数-似乎JSON字符串随后被视为JSON字符串值,并应用了转义。
 string json = ps.Invoke()[0].ToString();
return Content(json, "application/json");