AWS IoT POST запрос от.NET CF 3.5
У меня следующая проблема - я пытаюсь выполнить запрос POST с устройства с .NET CF 3.5
в AWS IoT, чтобы опубликовать сообщение в теме. Это хорошо работает для того же самого в Azure IoT Hub и из приложения на .NET 4.5
, Но когда я пытаюсь сделать запрос в AWS, я всегда получаю исключение the connection has timed out
, Вот как я делаю запрос:
public static HttpWebResponse InvokeHttpRequest(Uri endpointUri,
string httpMethod,
IDictionary<string, string> headers,
string requestBody)
{
try
{
var request = ConstructWebRequest(endpointUri, httpMethod, headers);
if (!string.IsNullOrEmpty(requestBody))
{
var buffer = new byte[requestBody.Length]; // 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);
}
}
requestStream.Flush();
requestStream.Close();
}
return 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 null;
}
}
}
URL, заголовки и все остальное в порядке, потому что он работает в.NET 4.5. Есть ли известное ограничение CF, которое может вызвать такую проблему?
Обратите внимание, что мне нужно было добавить
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true"/>
</settings>
в.NET 4.5 Client, потому что в противном случае я получил исключение The server committed a protocol violation. Section=ResponseStatusLine
так что, возможно, эта информация может помочь. Спасибо!
UPD вот это ConstructWebRequest
а также CheckResponse
код:
public static 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))
continue;
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;
}
public static void CheckResponse(HttpWebRequest request)
{
// Get the response and read any body into a string, then display.
using (var response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode == HttpStatusCode.OK)
{
Console.WriteLine("\n-- HTTP call succeeded");
var responseBody = ReadResponseBody(response);
if (!string.IsNullOrEmpty(responseBody))
{
Console.WriteLine("\n-- Response body:");
Console.WriteLine(responseBody);
}
}
else
Console.WriteLine("\n-- HTTP call failed, status code: {0}", response.StatusCode);
}
}