Powershell WebSocket (ClientWebSocket) отправить сообщение - PullRequest
0 голосов
/ 21 апреля 2020

Env: MacOs

Я пытаюсь создать меню, используя System.Net.HttpListener.

Можно ли использовать [System.Net.WebSockets.ClientWebSocket]$WebSocket для отправки информации клиенту браузера с помощью Powershell?

1 Ответ

2 голосов
/ 21 апреля 2020

Вы можете сделать это, но для того, чтобы веб-сервер отправлял любую информацию в браузер, браузер должен инициировать запрос, чаще всего это происходит с JavaScript.

Сначала настройте прослушиватель HTTP для сервера.

#Setting up the listener
$Server = [System.Net.HttpListener]::new()
$Server.Prefixes.Add('http://localhost:8001/')
$Server.Start()

Запускает веб-сервер, прослушивающий запросы в указанной точке входа. Далее мы определим короткую вспомогательную функцию, которую этот сценарий будет использовать для инкапсуляции отправки ответов обратно в браузер.

Function Send-WebServerResponse($InputObject){
    $JSON = $InputObject | ConvertTo-Json
    $buffer = [System.Text.Encoding]::UTF8.GetBytes($JSON)
    $Context.Response.ContentLength64 = $buffer.Length
    $Context.Response.OutputStream.Write($buffer, 0, $buffer.length)
    $Context.Response.OutputStream.Close()
    }

Следующий шаг - написать то, что было бы логином контроллера c, если бы это было MVC приложение. В основном это слой маршрутизации, поэтому скрипт знает, как реагировать в зависимости от типа запроса.

#Listening for a particular header value
$Context = $Server.GetContext()

    Write-Host "$($Context.Request.UserHostAddress) [$($Context.Request.HttpMethod)]=> $($Context.Request.Url)"  -ForegroundColor Green    

$RequestData = $Context.Request.Headers.GetValues('RequestData')
    if ($Context.Request.Url.AbsolutePath -eq '/TestMe'){
        Write-Host "Received request for /TestMe endpoint..."  -ForegroundColor Green
        $Body = [System.IO.StreamReader]::new($Context.Request.InputStream, $Context.Request.ContentEncoding)
        $Data = $Body.ReadToEnd() | convertfrom-stringdata
        $Body.Close()
        Send-WebServerResponse "Request Received successfully to /TestMe"

    }

Наконец, вот как выглядит JS для запроса информации у этого слушателя:

$.ajax({
            //the url to send the data to
            url: "TestMe",
            //the data to send to
            data: {SomeParam : "SomeValue"},
            //type. for eg: GET, POST
            type: "POST",
            //datatype expected to get in reply form server
            dataType: "json",
            //on success
            success: function(data){
                if (data){
                    Console.Log("Request Success");
                }
                else{
                    Console.Log("Request Failed!");
                }


            },
            //on error
            error: function(){
                //bad request

            }
        });

Написал этот ответ с помощью @ScottCorio, который научил меня этому методу.

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