GetRequestStream () выбрасывает исключение тайм-аута при публикации данных в URL HTTPS - PullRequest
12 голосов
/ 09 марта 2012

Я вызываю API, размещенный на сервере Apache, для публикации данных.Я использую HttpWebRequest для выполнения POST в C #.

API имеет ПОРТ обычного HTTP и защищенного уровня (HTTPS) на сервере.Когда я звоню HTTP URL, он работает отлично.Однако, когда я вызываю HTTPS, это дает мне исключение тайм-аута (в функции GetRequestStream ()).Есть идеи?Я использую VS 2010, .Net Framework 3.5 и C #.Вот блок кода:

string json_value = jsonSerializer.Serialize(data);


        HttpWebRequest request = (HttpWebRequest)System.Net.WebRequest.Create("https://server-url-xxxx.com");
        request.Method = "POST";
        request.ProtocolVersion = System.Net.HttpVersion.Version10;
        request.ContentType = "application/x-www-form-urlencoded";

        byte[] buffer = Encoding.ASCII.GetBytes(json_value);
        request.ContentLength = buffer.Length;
        System.IO.Stream reqStream = request.GetRequestStream();
        reqStream.Write(buffer, 0, buffer.Length);
        reqStream.Close();

EDIT: консольная программа, предложенная Питером, работает нормально.Но когда я добавляю данные (в формате JSON), которые необходимо опубликовать в API, это исключает исключение по тайм-ауту операции.Вот код, который я добавляю в консольное приложение, и он выдает ошибку.

byte[] buffer = Encoding.ASCII.GetBytes(json_value);
request.ContentLength = buffer.Length;

Ответы [ 4 ]

14 голосов
/ 12 апреля 2012

Я столкнулся с той же проблемой.Кажется, это решено для меня.Я прошел весь мой код, убедившись, что вызывал webResponse.Close () и / или responseStream.Close () для всех моих объектов HttpWebResponse.В документации указано, что вы можете закрыть поток или объект HttpWebResponse.Звонить обоим не вредно, так я и сделал.Отказ от закрытия ответов может привести к тому, что в приложении не будет соединений для повторного использования, и это, по-видимому, влияет на HttpWebRequest.GetRequestStream, насколько я могу наблюдать в своем коде.

10 голосов
/ 09 марта 2012

Я не знаю, поможет ли это вам в вашей конкретной проблеме, но вы должны рассмотреть возможность удаления некоторых из этих объектов, когда вы закончите с ними.Недавно я делал что-то подобное, и завершение использования операторов, похоже, очищает для меня кучу исключений тайм-аута.

            using (var reqStream = request.GetRequestStream())
            {
                if (reqStream == null)
                {
                    return;
                }

              //do whatever

            }

также проверяйте эти вещи

  • Является лисервер, обслуживающий https в вашей локальной среде разработки?
  • Правильно ли настроены привязки * .443 (https)?
  • Вам нужно установить учетные данные по запросу?
  • Это ваша учетная запись пула приложений, обращающаяся к ресурсам https, или ваша учетная запись проходит через нее?
  • Задумывались ли вы об использовании WebClient вместо этого?

    using (WebClient client = new WebClient())
        {               
            using (Stream stream = client.OpenRead("https://server-url-xxxx.com"))
            using (StreamReader reader = new StreamReader(stream))
            {
                MessageBox.Show(reader.ReadToEnd());
            }
        }
    

РЕДАКТИРОВАТЬ:

сделать запрос с консоли.

internal class Program
{
    private static void Main(string[] args)
    {
        new Program().Run();
        Console.ReadLine();
    }

    public void Run()
    {

       var request = (HttpWebRequest)System.Net.WebRequest.Create("https://server-url-xxxx.com");
        request.Method = "POST";
        request.ProtocolVersion = System.Net.HttpVersion.Version10;
        request.ContentType = "application/x-www-form-urlencoded";

        using (var reqStream = request.GetRequestStream())
        {
            using(var response = new StreamReader(reqStream )
            {
              Console.WriteLine(response.ReadToEnd());
            }
        }
    }
}
3 голосов
/ 28 октября 2016

Попробуйте это:

    WebRequest req = WebRequest.Create("https://server-url-xxxx.com");
    req.Method = "POST";
    string json_value = jsonSerializer.Serialize(data); //Body data
    ServicePointManager.Expect100Continue = false;
    using (var streamWriter = new StreamWriter(req.GetRequestStream()))
    {
        streamWriter.Write(json_value);
        streamWriter.Flush();
        streamWriter.Close();
    }
    HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
    Stream GETResponseStream = resp.GetResponseStream();
    StreamReader sr = new StreamReader(GETResponseStream);
    var response = sr.ReadToEnd(); //Response
    resp.Close(); //Close response
    sr.Close(); //Close StreamReader

И просмотр URI:

  • Зарезервированные символы. Отправка зарезервированных символов по URI может принести проблемы ! * ' ( ) ; : @ & = + $ , / ? # [ ]

  • Длина URI: вы не должны превышать 2000 символов

1 голос
/ 09 марта 2012

Вы можете установить свойство тайм-аута, проверьте его здесь http://www.codeproject.com/Tips/69637/Setting-timeout-property-for-System-Net-WebClient

...