Ich versuche eine Anwendung zu erstellen, die eine kleine Binärdatei (20-25 KB) von einem benutzerdefinierten Webserver mit httpwebrequests herunterlädt.C# - Gibt es eine Grenze für die Größe eines httpWebRequest-Streams?
Dies ist die serverseitige Code:
Stream UpdateRequest = context.Request.InputStream;
byte[] UpdateContent = new byte[context.Request.ContentLength64];
UpdateRequest.Read(UpdateContent, 0, UpdateContent.Length);
String remoteVersion = "";
for (int i = 0;i < UpdateContent.Length;i++) { //check if update is necessary
remoteVersion += (char)UpdateContent[i];
}
byte[] UpdateRequestResponse;
if (remoteVersion == remotePluginVersion) {
UpdateRequestResponse = new byte[1];
UpdateRequestResponse[0] = 0; //respond with a single byte set to 0 if no update is required
} else {
FileInfo info = new FileInfo(Path.Combine(Directory.GetCurrentDirectory(), "remote logs", "PointAwarder.dll"));
UpdateRequestResponse = File.ReadAllBytes(Path.Combine(Directory.GetCurrentDirectory(), "remote logs", "PointAwarder.dll"));
//respond with the updated file otherwise
}
//this byte is past the threshold and will not be the same in the version the client recieves
Console.WriteLine("5000th byte: " + UpdateRequestResponse[5000]);
//send the response
context.Response.ContentLength64 = UpdateRequestResponse.Length;
context.Response.OutputStream.Write(UpdateRequestResponse, 0, UpdateRequestResponse.Length);
context.Response.Close();
Danach wird der Array UpdateRequestResponse die gesamte Datei enthält und an den Client gesendet wurde.
Der Client läuft diesen Code:
//create the request
WebRequest request = WebRequest.Create(url + "pluginUpdate");
request.Method = "POST";
//create a byte array of the current version
byte[] requestContentTemp = version.ToByteArray();
int count = 0;
for (int i = 0; i < requestContentTemp.Length; i++) {
if (requestContentTemp[i] != 0) {
count++;
}
}
byte[] requestContent = new byte[count];
for (int i = 0, j = 0; i < requestContentTemp.Length; i++) {
if (requestContentTemp[i] != 0) {
requestContent[j] = requestContentTemp[i];
j++;
}
}
//send the current version
request.ContentLength = requestContent.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(requestContent, 0, requestContent.Length);
dataStream.Close();
//get and read the response
WebResponse response = request.GetResponse();
Stream responseStream = response.GetResponseStream();
byte[] responseBytes = new byte[response.ContentLength];
responseStream.Read(responseBytes, 0, (int)response.ContentLength);
responseStream.Close();
response.Close();
//if the response containd a single 0 we are up-to-date, otherwise write the content of the response to file
if (responseBytes[0] != 0 || response.ContentLength > 1) {
BinaryWriter writer = new BinaryWriter(File.Open(Path.Combine(Directory.GetCurrentDirectory(), "ServerPlugins", "PointAwarder.dll"), FileMode.Create));
writer.BaseStream.Write(responseBytes, 0, responseBytes.Length);
writer.Close();
TShockAPI.Commands.HandleCommand(TSPlayer.Server, "/reload");
}
Das Byte-Array responseBytes auf dem Client sollte auf dem Array UpdateRequestResponse auf dem Server identisch sein, aber es ist nicht. nach etwa 4000 Bytes wird jedes Byte danach auf 0 gesetzt, anstatt wie es sein sollte (responseBytes [3985] ist das letzte Nicht-Null-Byte).
Ist dies der Fall, weil httpWebRequest eine Größenbeschränkung hat? Ich kann keinen Fehler in meinem Code sehen, der sie verursachen könnte, und derselbe Code funktioniert in anderen Fällen, in denen ich nur kurze Datensequenzen (weniger als 100 Bytes) weitergeben muss.
Die MSDN-Seiten erwähnen keine Größenbeschränkung wie folgt.
Das scheint es behoben zu haben! Vielen Dank, das hätte ich nie erraten. Ich dachte, dass die Ausführung angehalten wurde, bis alle Daten vollständig übertragen wurden. Da dies meine erste Frage ist, gibt es irgendetwas, das Sie gesehen haben, dass ich das nächste Mal verbessern könnte? – Annonymus
Es ist ein kniffliges Problem, ich habe Code in die Produktion gedrängt, der gut funktioniert (lokal!) Und dann im Live-Test versagt, weil ich dieses Problem nicht berücksichtigt habe. Die Frage war sehr gut geschrieben, deshalb habe ich leider keinen Rat für dich! –
Das klingt wie ein Albtraum! In meinem Fall kann ich gar nicht lokal testen, ich muss eine zweite Instanz der Anwendung auf dem Live-Server erstellen (mit geänderten Ports/Pipe-Namen etc.). Sie denken, es ist bedauerlich, dass meine Frage gut geschrieben wurde? Das kommt mir seltsam vor ... Danke für das Kompliment. – Annonymus