2011-01-03 7 views
0

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.

Antwort

0

Ist Ihre 500-Fehlermeldung die generische IIS und nicht die ASP.Net? Wenn das so ist, bedeutet das wahrscheinlich, dass die Daten nicht einmal zu ASP.Net gelangen und dass IIS daran erstickt. Meine erste Vermutung ist, dass Sie auf ein Upload-Limit stoßen. Here's a way to increase this in IIS 6. Sobald IIS eingestellt ist, müssen Sie auch change the value for ASP.Net. Was Ihre anderen Fehler betrifft, sollten Sie wirklich darauf achten, sie einzufangen. Das .Net-Framework kann ziemlich gut erklären, was schief läuft.