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);
    }
}

0 ответов

Другие вопросы по тегам