Nano Hash - криптовалюты, майнинг, программирование

HTTPWebRequest: дубликат сообщения

У меня есть следующий класс ниже для обработки HTTP. Я использую это так:

   HTTP http = new HTTP();
   string buffer = http.request("http://www.x.com", "username=user&pass=pass");

Я использую httpAnalyzer для просмотра данных. Иногда данные поста нормальные:

   username=user&pass=pass

Иногда пишут так:

   username=user&pass=passusername=user&pass=pass

даже несмотря на то, что «длина содержимого» остается одинаковой в обоих случаях. Любые советы о том, почему он ведет себя так? Спасибо!

   public partial class HTTP {   

    public static ManualResetEvent allDone = new ManualResetEvent(false);
    const int BUFFER_SIZE = 2048;
    const int DefaultTimeout = 500000;  
    public CookieContainer cookies = new CookieContainer();

    public string GET(string url, string post)
    {
            string buffer = ""; 

            Console.WriteLine(url);

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.CookieContainer = cookies; request.KeepAlive = true;

            System.Net.ServicePointManager.Expect100Continue = false;
            request.Accept = "*/*";
            request.Headers.Add("Accept-Encoding", "deflate,sdch");
            request.Headers.Add("Accept-Language", "en-US,en;q=0.8");
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36";
            request.Referer = "https://www.host.com";
            request.KeepAlive = true;

            System.Net.ServicePointManager.Expect100Continue = false;
            RequestState myRequestState = new RequestState();
            AutoResetEvent ev = new AutoResetEvent(false);
            request.KeepAlive = true;
            request.AllowAutoRedirect = true;
            StringBuilder sb = new StringBuilder();

            if (post.Length > 0)
            {
                request.Method = "POST";
                request.ContentLength = post.Length;

                request.CookieContainer = cookies;
                request.ContentType = "application/x-www-form-urlencoded";

                StreamWriter writer = new StreamWriter(request.GetRequestStream());
                writer.Write(post);
                writer.Close();
            }

            ThreadPool.RegisterWaitForSingleObject(ev, new WaitOrTimerCallback(TimeoutCallback), request, DefaultTimeout, true);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream());

            buffer = "";
            buffer = reader.ReadToEnd();

            for (int i = 0; i < response.Headers.Count; i++)
            {
                string name = response.Headers.GetKey(i);
                string value = response.Headers.Get(i);
                if (name == "Set-Cookie")
                {
                    Match match = Regex.Match(value, "(.+?)=(.+?)");
                    string[] tmp = value.Split('=');
                    if (match.Captures.Count > 0)
                    {
                        Uri u = new Uri("https://www.host.com");
                        cookies.SetCookies(u, tmp[0] + "=" + tmp[1]);
                    }
                }
            }

            request.CookieContainer = cookies;
            response.Close();
            reader.Close();
            return buffer;
    }


    public class RequestState
    {

        const int BUFFER_SIZE = 1024;
        public StringBuilder requestData;
        public byte[] BufferRead;
        public HttpWebRequest request;
        public HttpWebResponse response;
        public Stream streamResponse;
        public RequestState()
        {
            BufferRead = new byte[BUFFER_SIZE];
            requestData = new StringBuilder("");
            request = null;
            streamResponse = null;
        }
    }

    private static void TimeoutCallback(object state, bool timedOut)
    {
        if (timedOut)
        {
            HttpWebRequest request = state as HttpWebRequest;
            if (request != null)
            {
                request.Abort();
            }
        }
    }
  }
24.09.2013

Ответы:


1

В документации упоминается:

Вы должны вызвать метод Stream.Close, чтобы закрыть поток и освободить соединение для повторного использования. Неспособность закрыть поток приводит к тому, что у вашего приложения заканчиваются соединения.

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

using (Stream requestStream = request.GetRequestStream())
using (StreamWriter writer = new StreamWriter(requestStream))
{
    writer.Write(post);
}
24.09.2013
  • Спасибо, но, к сожалению, это не решило проблему. 24.09.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..