Веб-запрос Powershell — 400 неверных запросов

Я создаю сценарий powershell для выполнения команд на REST-подобном сервере, я использую powershell для отправки XML-данных в веб-службу. Все работает отлично, за исключением случаев, когда "приложение" выдает ошибку. Приложение отвечает с подробностями в xml, а также выдает ошибку веб-запроса (в данном случае 400), когда у меня возникают проблемы. Всякий раз, когда я получаю ошибку веб-запроса, которая не равна 200, команды выдают ошибку, которая портит то, как я обрабатываю ошибку.

Это пример ответа, который я получаю (с использованием скрипача):

HTTP/1.1 400 Bad Request
Date: Thu, 29 Nov 2012 04:29:48 GMT
Content-Type: text/xml;charset=ISO-8859-1
Connection: close

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Status>
    <operation>Add Network</operation>
    <result>ERROR</result>
    <resultCode>REASON_210</resultCode>
</Status>

Это ошибка, которую я получаю в powershell:

Exception calling "UploadData" with "3" argument(s): "The remote server returned an error: (400) Bad Request."
At C:\Scripting\test.ps1:47 char:34
+     $response = $query.UploadData <<<< ($url,"POST",$byteArray)
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

Exception calling "GetString" with "1" argument(s): "Array cannot be null.
Parameter name: bytes"
At C:\Scripting\test.ps1:48 char:62
+     $stringresponse = [System.Text.Encoding]::ASCII.GetString <<<< ($response)
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

Я углубился в ошибку, и это настолько близко, насколько я мог получить содержимое ответа (XML).

Я думал, что я мог бы вытащить его из этого ..

$error[1].exception.InnerException.Data

Но там пусто :(

PS C:\Scripting> $error[1].exception.InnerException | fl -force


Status         : ProtocolError
Response       : System.Net.HttpWebResponse
Message        : The remote server returned an error: (400) Bad Request.
Data           : {}
InnerException :
TargetSite     : Byte[] UploadDataInternal(System.Uri, System.String, Byte[], System.Net.WebRequest ByRef)
StackTrace     :    at System.Net.WebClient.UploadDataInternal(Uri address, String method, Byte[] data, WebRequest& request)
                    at System.Net.WebClient.UploadData(Uri address, String method, Byte[] data)
                    at System.Net.WebClient.UploadData(String address, String method, Byte[] data)
                    at UploadData(Object , Object[] )
                    at System.Management.Automation.MethodInformation.Invoke(Object target, Object[] arguments)
                    at System.Management.Automation.DotNetAdapter.AuxiliaryMethodInvoke(Object target, Object[] arguments, MethodInformation methodInformation, Object[]
                 originalArguments)
HelpLink       :
Source         : System


PS C:\Scripting> $error[1].exception.InnerException.response | fl


IsMutuallyAuthenticated : False
Cookies                 : {}
Headers                 : {Connection, Transfer-Encoding, Content-Type, Date}
ContentLength           : -1
ContentEncoding         :
ContentType             : text/xml;charset=ISO-8859-1
CharacterSet            : ISO-8859-1
Server                  :
LastModified            : 29/11/12 4:04:19 PM
StatusCode              : BadRequest
StatusDescription       : Bad Request
ProtocolVersion         : 1.1
ResponseUri             : https://api-au.dimensiondata.com/oec/0.9/cdefb891-1552-4008-8638-7393eda8d7e1/network
Method                  : POST
IsFromCache             : False

Вот мой код powershell, который я использую:

function send_web ($url,$data) {
    [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
    $query = new-object system.net.WebClient
    $auth = 'Basic ' + [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($username+":"+$password ))
    $query.Headers.Add('Authorization', $auth )
    [byte[]]$byteArray = [System.Text.Encoding]::ASCII.GetBytes($data) 
    $query.Headers.Add("ContentType","application/xml")
    $response = $query.UploadData($url,"POST",$byteArray)
    $stringresponse = [System.Text.Encoding]::ASCII.GetString($response)
    return $stringresponse
}

Кажется, что это не должно быть сложно сделать, любая помощь будет высоко оценена :)

Ричард


person Richard Gray    schedule 29.11.2012    source источник
comment
Я бы использовал Fiddler, чтобы проверить исходящий запрос и посмотреть, сможете ли вы обнаружить какие-либо проблемы с запросом (не закодированный URL-адрес, неверный заголовок и т. д.).   -  person Keith Hill    schedule 29.11.2012
comment
Спасибо за ваш ответ, Кит, я использовал скрипач и показал результат в вопросе. Служба дает мне ответ 400, когда приложение выдает ошибку, я не думаю, что это связано с форматом запроса. Я проверил это, выполнив запрос, который отлично работает. Затем, запустив идентичный запрос, он выдает ответ 400 с телом (приложением), указывающим дублирующийся запрос. Я пытаюсь вникнуть в XML ответа 400, и мне не повезло.   -  person Richard Gray    schedule 03.12.2012
comment
У меня может быть такая же проблема, вы решили эту? stackoverflow.com/questions/33624749/   -  person HMR    schedule 10.11.2015