Обмен данными BSON со страницей asp - PullRequest
0 голосов
/ 03 января 2011

Добрый день.

Я пытаюсь обмениваться сериализованными данными между клиентским приложением и страницей asp.net.

Я использую следующие классы для обмена:

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

и

public class Receive
{
    public Guid guidField;
    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 / UnpackReceive аналогичный.

Когда я использую ContentType = "application/x-www-form-urlencoded"Я могу сделать обмен, но если только public byte[] data размер поля не превышает ~ 1200 байт.Если размер больше, я получаю Внутреннюю ошибку 500 сервера, делающую запрос.

Использование ContentType = "text/xml";Любой размер поля "public byte [] data" обрабатывается должным образом на стороне сервера.Полезная работа выполнена, но, когда сервер пытается записать в поток ответов, я предполагаю, что происходит ошибка, и автоматически повторяется запрос, так что клиентское приложение застревает, загружая сервер множеством похожих запросов, не выдавая никакой ошибки.ContentType = "application/octet-stream" - показывает то же поведение, что и "text / xml".

Может кто-нибудь предложить правильную строку ContentType или дать совет, как правильно справиться с этой ситуацией.Спасибо.

1 Ответ

0 голосов
/ 03 января 2011

Является ли ваше сообщение об ошибке 500 общим IIS, а не ASP.Net? Если это так, это, вероятно, означает, что данные даже не попадают в ASP.Net и что IIS задыхается от них. Мое первое предположение заключается в том, что вы столкнулись с лимитом загрузки. Вот способ увеличить это в IIS 6 . После настройки IIS вам также придется изменить значение для ASP.Net . Что касается ваших других ошибок, вы действительно должны заглянуть в них. .Net Framework хорошо объясняет, что идет не так.

...