0

良い一日。

私がやろうとしているのは、クライアント アプリケーションと 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文字列を提案したり、この状況を適切に処理する方法をアドバイスしたりできますか? ありがとうございました。

4

1 に答える 1

0

あなたの 500 エラー メッセージは、ASP.Net のものではなく、一般的な IIS のものですか? もしそうなら、それはおそらく、データが ASP.Net に到達しておらず、IIS がデータを詰まらせていることを意味します。私の最初の推測では、アップロードの制限に達しているということです。IIS 6 でこれを増やす方法は次のとおりです。IIS を設定したら、 ASP.Net の値も変更する必要があります。他のエラーについては、それらをトラップすることを検討する必要があります。.Net フレームワークは、何がうまくいかないかをうまく説明しています。

于 2011-01-03T17:51:46.517 に答える