Ошибка в потоке HttpWebRequest превышает размер байтов Content-Length - PullRequest
0 голосов
/ 31 марта 2020

Это добавление отгрузки в API Orderhive и аутентификация AWS4 Signature. Это полная ошибка: количество байтов, записываемых в поток, превышает указанный размер байтов Content-Length. Ниже приведена реализация, которая вызывает ошибку.

 var headers = new Dictionary<string, string>
                {
                    {AWS4SignerBase.X_Amz_Content_SHA256, contentHashString},
                    {"content-length", requestBody.Length.ToString()},
                    {"content-type", "application/json"},
                    {"id_token", _credentails.id_token},
                    {"X-Amz-Security-Token",  _credentails.session_token}
                };

public string InvokeHttpRequest(Uri endpointUri,
                                             string httpMethod,
                                             IDictionary<string, string> headers,
                                             string requestBody)
        {
            string responseBody = "";
            try
            {
                var request = ConstructWebRequest(endpointUri, httpMethod, headers);

                if (!string.IsNullOrEmpty(requestBody))
                {
                    var buffer = new byte[8192]; // arbitrary buffer size                        
                    var requestStream = request.GetRequestStream();
                    using (var inputStream = new MemoryStream(Encoding.UTF8.GetBytes(requestBody)))
                    {
                        var bytesRead = 0;
                        while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            requestStream.Write(buffer, 0, bytesRead);
                        }
                    }
                }

                responseBody = CheckResponse(request);
            }
            catch (WebException ex)
            {
                using (var response = ex.Response as HttpWebResponse)
                {
                    if (response != null)
                    {
                        var errorMsg = ReadResponseBody(response);
                        Console.WriteLine("\n-- HTTP call failed with exception '{0}', status code '{1}'", errorMsg, response.StatusCode);
                    }
                }
            }

            return responseBody;
        }



public HttpWebRequest ConstructWebRequest(Uri endpointUri,
                                                         string httpMethod,
                                                         IDictionary<string, string> headers)
        {
            var request = (HttpWebRequest)WebRequest.Create(endpointUri);
            request.Method = httpMethod;

            foreach (var header in headers.Keys)
            {
                // not all headers can be set via the dictionary
                if (header.Equals("host", StringComparison.OrdinalIgnoreCase))
                    request.Host = headers[header];
                else if (header.Equals("content-length", StringComparison.OrdinalIgnoreCase))
                    request.ContentLength = long.Parse(headers[header]);
                else if (header.Equals("content-type", StringComparison.OrdinalIgnoreCase))
                    request.ContentType = headers[header];
                else
                    request.Headers.Add(header, headers[header]);
            }

            return request;
        }

Я не могу понять, как я могу изменить код, чтобы исправить это. Пожалуйста помоги. Спасибо.

1 Ответ

1 голос
/ 31 марта 2020

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

При настройке длины содержимого с помощью:

"content-length", requestBody.Length.ToString()

Вы отправляете в качестве содержимого следующее:

Encoding.UTF8.GetBytes(requestBody)

Строка Length и количество байтов в ее двоичном представлении UTF8 отличаются здесь.

Пожалуйста, попробуйте установить длину содержимого как такие:

"content-length", Encoding.UTF8.GetByteCount(requestBody).ToString()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...