.net 与asp页面交换BSON数据

.net 与asp页面交换BSON数据,.net,asp.net,json,bson,.net,Asp.net,Json,Bson,你好 我要做的是在客户端应用程序和asp.net页面之间交换序列化数据 我使用以下类进行exchange: public class Send { public Guid guidField; public string stringField1; public string stringField2; public byte[] data; } 及 在客户端,我使用以下代码发出请求: public Receive Exchange(Send send) {

你好

我要做的是在客户端应用程序和asp.net页面之间交换序列化数据

我使用以下类进行exchange:

public class Send
{
    public Guid guidField;
    public string stringField1;
    public string stringField2;
    public byte[] data;
}

在客户端,我使用以下代码发出请求:

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;
}
在服务器端,我的做法类似,但方向相反:

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();
}
对于打包和解包数据,我使用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);
}
PackReceive/unpacreceive的代码与此类似

当我使用ContentType=application/x-www-form-urlencoded时,我能够进行交换,但前提是公共字节[]数据字段大小不超过~1200字节。如果大小更大,则执行请求时会出现内部服务器错误500

使用ContentType=text/xml;在服务器端正确处理任何大小的公共字节[]数据字段。有用的工作已经完成,但当服务器尝试写入响应流时,我猜会发生错误,并且自动提交请求会重复,所以客户端应用程序会被卡住,用多个类似的请求淹没服务器而不会引发任何错误。 ContentType=application/octet-stream-显示与text/xml相同的行为


任何人都可以建议一个合适的ContentType字符串,或者给出如何正确处理这种情况的建议。谢谢。

您的500错误消息是通用IIS错误消息,而不是ASP.Net错误消息吗?如果是这样的话,这可能意味着数据甚至没有到达ASP.Net,IIS正在阻塞它。我的第一个猜测是你的上传量已经达到了极限。一旦设置了IIS,您还必须。至于你的其他错误,你应该认真研究如何捕捉它们。Net框架在解释问题方面做得相当好

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);
}