Frage

Ich versuche, eine Anlage zu CouchDB POST die HttpWebRequest verwenden. Allerdings, wenn ich versuche, "response = (HttpWebResponse) httpWebRequest.GetResponse ();" Ich erhalte eine WebException mit der Meldung „Die zugrunde liegende Verbindung wurde geschlossen:. Eine Verbindung, die am Leben gehalten wird erwartet wurde, wurde vom Server geschlossen“

Ich habe einige Artikel gefunden besagt, dass die Keep-Alive auf false gesetzt und httpversion bis 1,0 löst sich die Situation. Ich finde, dass es nicht exakt die gleichen Fehler nicht yeilding plus Ich möchte nicht, diesen Ansatz zu nehmen, wie ich die Version 1.0 nicht verwenden möchten darauf zurückzuführen, wie es die Verbindung behandelt.

Irgendwelche Vorschläge oder Ideen sind willkommen. Ich werde sie alle, bis ein Werk versuchen!

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);
    }
War es hilfreich?

Lösung

Nach einer beträchtlichen Menge an Forschung zum Thema, habe ich beschlossen, PUT zu verwenden. Während Futon die POST-Methode verwendet, ist es nicht dokumentiert. Für alle, dies in Zukunft zu lesen, verwenden Sie die PUT-Methode, wird es Ihr Leben viel einfacher machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top