ASP.NET Core Web Api и PowerShell Invoke-RestMethod (сообщение о методе) плюс ResponseText/ReturnValue/ErrorMessage

В настоящее время я разрабатываю ASP.NET Core Web API (v3.1) (плюс сценарий PowerShell).

Контроллер

[Route("api/[controller]")]
[ApiController]
public class RegisterDeviceController : ControllerBase
{
    private readonly SCMDB _context;

    public RegisterDeviceController(SCMDB context)
    {
        _context = context;
    }

    // POST: api/RegisterDevice
    [HttpPost]
    public async Task<ActionResult<Device>> PostDevice(Device device)
    {
        if (device.SiteKey == null)
            return StatusCode(406,"NoSiteKeyDefined!");
        return null;
    }
}

«Потребитель» — это сценарий PowerShell:

# Post to web api
try{
    $response = Invoke-RestMethod -Uri "$ScmWebApiUrl" -Method Post -Body $JsonString -ContentType "application/json"
    }
    catch {
        $err = $_.Exception
    }

Write-Host $ErrResp

Я пытаюсь понять: как получить ResponseText "NoSiteKeyDefined!" в PowerShell.

Я получил:

[DBG]: PS C:\Windows\system32>> $err.Message
The remote server returned an error: (406) Not Acceptable.

Но мне также нужно сообщение (в данном случае -> NoSiteKeyDefined!)

Это не обязательно должен быть код ошибки 406, это также может быть другой «ActionResult» или ответ. Я также пробовал возвращать BadRequest("NoSiteKeyDefined!"), но я не нахожу этого фрагмента сообщения ни в $response, ни в объекте $err. Важно то, что я могу передать сообщение, которое можно получить и обработать в сценарии PowerShell.


person Christian Casutt    schedule 03.05.2020    source источник
comment
как выглядит ваш $JsonString?, можете ли вы посмотреть его значение в отладке в VS?   -  person Avshalom    schedule 03.05.2020
comment
@Avshalom: в основном $JsonString не имеет значения. Единственное, что имеет значение, — это $response или, может быть, $_.Exception — это то, что PowerShell получает/получает от REST API.   -  person Christian Casutt    schedule 03.05.2020


Ответы (1)


Я пытаюсь понять: как получить ResponseText "NoSiteKeyDefined!" в PowerShell

Я могу воспроизвести ту же проблему при доступе к свойству Exception с помощью $_.Exception, которое включает подробное сообщение об исключении WebException.

Чтобы получить значение 'NoSiteKeyDefined!', которое мы установили, мы можем получить к нему доступ, используя Write-Host $_ напрямую, как показано ниже.

try{
    $ScmWebApiUrl = 'https://xxxx/api/RegisterDevice'

    $Body = @{
         SiteKey = $NULL
    }

    $JsonString = $Body | ConvertTo-Json

    $response = Invoke-RestMethod -Uri "$ScmWebApiUrl"  -Method Post -Body $JsonString -ContentType 'application/json'
}
catch{
    Write-Host $_
    Write-Host $_.Exception
}

Результат испытаний

введите здесь описание изображения

person Fei Han    schedule 04.05.2020
comment
интересная находка. Я не могу воспроизвести это. Какую версию PowerShell вы используете? Можете ли вы опубликовать подробности о вашей таблице $PSVersionTable? Моя PS-версия: 5.1.18362.752. Я не использую ядро ​​​​PS .net, так как сценарий должен работать на собственной установке W10. - person Christian Casutt; 04.05.2020