KeepAliveException bei der Verwendung von HttpWebRequest.GetResponse
-
23-09-2019 - |
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);
}
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.