KeepAliveException при использовании HttpWebRequest.GetResponse

Я пытаюсь отправить вложение в CouchDB, используя HttpWebRequest. Однако, когда я пытаюсь "response = (HttpWebResponse) httpWebRequest.GetResponse ();" Я получаю исключение WebException с сообщением «Базовое соединение было закрыто: соединение, которое, как ожидалось, должно было оставаться активным, было закрыто сервером».

Я нашел несколько статей, в которых говорится, что установка keepalive на false и httpversion на 1.0 разрешает ситуацию. Я обнаружил, что это не вызывает ту же ошибку, плюс я не хочу использовать этот подход, поскольку я не хочу использовать версию 1.0 из-за того, как она обрабатывает соединение.

Любые предложения или идеи приветствуются. Я попробую их все, пока один не сработает!

public ServerResponse PostAttachment(Server server, Database db, Attachment attachment)
    {
        Stream dataStream;
        HttpWebResponse response = null;
        StreamReader sr = null;
        byte[] buffer;
        string json;
        string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
        string headerTemplate = "Content-Disposition: form-data; name=\"_attachments\"; filename=\"" + attachment.Filename + "\"\r\n Content-Type: application/octet-stream\r\n\r\n";
        byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(headerTemplate);
        byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");


        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://" + server.Host + ":" + 
            server.Port.ToString() + "/" + db.Name + "/" + attachment.Document.Id);
        httpWebRequest.ContentType = "multipart/form-data; boundary=" + boundary;
        httpWebRequest.Method = "POST";
        httpWebRequest.KeepAlive = true;
        httpWebRequest.ContentLength = attachment.Stream.Length + headerbytes.Length + boundarybytes.Length;

        if (!string.IsNullOrEmpty(server.EncodedCredentials))
            httpWebRequest.Headers.Add("Authorization", server.EncodedCredentials);

        if (!attachment.Stream.CanRead)
            throw new System.NotSupportedException("The stream cannot be read.");

        // Get the request stream
        try
        {
            dataStream = httpWebRequest.GetRequestStream();
        }
        catch (Exception e)
        {
            throw new WebException("Failed to get the request stream.", e);
        }


        buffer = new byte[server.BufferSize];
        int bytesRead;

        dataStream.Write(headerbytes,0,headerbytes.Length); 

        attachment.Stream.Position = 0;
        while ((bytesRead = attachment.Stream.Read(buffer, 0, buffer.Length)) > 0)
        {
            dataStream.Write(buffer, 0, bytesRead);
        }

        dataStream.Write(boundarybytes, 0, boundarybytes.Length);
        dataStream.Close();

        // send the request and get the response
        try
        {
            response = (HttpWebResponse)httpWebRequest.GetResponse();
        }
        catch (Exception e)
        {
            throw new WebException("Invalid response received from server.", e);
        }

        // get the server's response json
        try
        {
            dataStream = response.GetResponseStream();
            sr = new StreamReader(dataStream);
            json = sr.ReadToEnd();
        }
        catch (Exception e)
        {
            throw new WebException("Failed to access the response stream.", e);
        }

        // close up all our streams and response
        sr.Close();
        dataStream.Close();
        response.Close();

        // Deserialize the server response
        return ConvertTo.JsonToServerResponse(json);
    }

person Lucas    schedule 01.04.2010    source источник
comment
На какой сервер вы отправляете сообщения? Кроме того, какие ошибки возникают при использовании HTTP / 1.0. Вы используете аутентификацию? ЕСЛИ да, то какая аутентификация?   -  person feroze    schedule 02.04.2010
comment
CouchDB имеет собственный веб-сервер, поэтому их собственный сервер. Та же ошибка с 1.0. Обычная проверка подлинности.   -  person Lucas    schedule 04.04.2010


Ответы (1)


После значительного количества исследований по этой теме я решил использовать PUT. Хотя Futon использует метод POST, он недокументирован. Для тех, кто будет читать это в будущем, используйте метод PUT, он значительно упростит вашу жизнь.

person Lucas    schedule 03.04.2010