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