Это добавление отгрузки в 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;
}
Я не могу понять, как я могу изменить код, чтобы исправить это. Пожалуйста помоги. Спасибо.