Guten Tag.Exchange BSON-Daten mit ASP-Seite
Was ich versuche zu tun ist, serialisierte Daten zwischen Client-Anwendung und asp.net-Seite auszutauschen.
Ich verwende die folgenden Klassen für den Austausch:
public class Send
{
public Guid guidField;
public string stringField1;
public string stringField2;
public byte[] data;
}
und
public class Receive
{
public Guid guidField;
public byte[] data;
}
Auf Client-Seite verwende ich den folgenden Code einen Antrag zu stellen:
public Receive Exchange(Send send)
{
Receive receive = new Receive();
string address = "example.org";
HttpWebRequest client = (HttpWebRequest)WebRequest.Create(address);
client.ContentType = "application/x-www-form-urlencoded";
client.Timeout = 90000;
client.Method = "POST";
client.UserAgent = "AgentMe";
try
{
Stream stream = client.GetRequestStream();
PackSend(stream, send);
stream.Flush();
stream.Close();
var response = client.GetResponse();
Stream outputStream = response.GetResponseStream();
UnpackReceive(outputStream, out receive);
}
catch (WebException ex)
{ }
return receive;
}
Auf Server-Seite Ich mache es ähnlich, aber in die entgegengesetzte Richtung:
protected void Page_Load(object sender, EventArgs e)
{
Stream inputStream = Request.InputStream;
Send send;
UnpackSend(inputStream, out send);
// here goes some useful work
Receive receive = Process(send);
Response.ContentType = "application/x-www-form-urlencoded";
Stream stream = Response.OutputStream;
PackReceive(stream, sent);
Response.End();
}
Für Verpackung und Daten Auspacken ich Newtonsoft.Json:
static void PackSend(Stream stream, Send message)
{
BsonWriter writer = new BsonWriter(stream);
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(writer, message);
writer.Flush();
writer.Close();
}
void UnpackSend(Stream stream, out Send message)
{
BsonReader reader = new BsonReader(stream);
JsonSerializer serializer = new JsonSerializer();
message = serializer.Deserialize<Send>(reader);
}
Der Code für PackReceive/UnpackReceive analog ist.
Wenn ich ContentType = "application/x-www-form-urlencoded"
verwenden kann ich Austausch tun, aber wenn nur public byte[] data
Feldgröße nicht ~ 1200 Bytes überschreitet. Wenn die Größe größer ist, erhalte ich einen internen Serverfehler 500, der die Anfrage ausführt.
Verwendung ContentType = "text/xml"
; Jede Größe des Feldes "public byte [] data" wird auf der Serverseite korrekt gehandhabt. Nützliche Arbeit ist getan, aber wenn Server versucht, in Antwort-Stream zu schreiben, ich denke, Fehler auftritt und automatisch Request wiederholt wird, so Client-Anwendung fest ist, Überschwemmung Server mit mehreren ähnlichen Anfragen, ohne einen Fehler zu werfen. ContentType = "application/octet-stream"
- zeigt das gleiche Verhalten wie "text/xml".
Kann jemand empfehlen eine richtige ContentType
Zeichenfolge oder einen Rat geben, wie Sie diese Situation richtig behandeln. Vielen Dank.