0

私はcisとasp.netをc#で使用しています。

私はJavaScriptSerializerを使用して構築したJSON文字列を持っており、MaxJsonLengthをInt32.MaxValueに設定しています。ここで、このResponse.Write(myJsonString)のようにresponse.writeを使用してこれを返したいのですが、これが正しい方法であるかどうか疑問に思っています。それ?文字列が非常に長い場合(ベース64でエンコードされた巨大なバイトも含まれる場合があります)、それでもint32.maxvalueの長さの範囲内にある場合、問題はありますか?IIS自体からの制限はありますか(返すことができる最大長など)?または、文字列を1文字ずつ送信し、x文字ごとに応答をフラッシュするループを作成する必要がありますか?

余談ですがresponse.write、受信側でJSON文字列を適切に使用できるように、の前にUTF8 BOMを追加する必要がありますか?JSON文字列にbase64でエンコードされたバイトが含まれている場合、何か影響はありますか?

4

1 に答える 1

2

今、私はこのResponse.Write(myJsonString)のように、response.writeを使ってこれを返したいのですが、これはそれを返す適切な方法ですか?

JavaScriptSerializer クラスを使用する代わりに、JSON.NETまたは組み込みのを使用することを検討してDataContractJsonSerializerください。どちらも出力ストリームに直接シリアライズできます。

var serializer = new JsonSerializer();
serializer.Serialize(context.Response.Output, objectToSerialize);

この方法では、JSON 文字列全体をメモリにロードする必要はありません。

文字列が非常に長い場合 (base 64 でエンコードされた巨大なバイトも含まれている可能性があります)、問題はありますか? それがまだ int32.maxvalue の長さの範囲内にある場合、iis 自体からの制限はありますか? (私が返すことができる最大長のように)

IIS に関する限り、問題はないと思います。しかし、前述したように、クライアントに直接ストリーミングするのではなく、文字列へのシリアル化を実行すると、サーバーで大量のメモリが消費されます。

または、文字列を1文字ずつ送信し、x文字ごとに応答をフラッシュするループを作成する必要がありますか?

JSON 文字列全体がまだメモリにあるため、これはあまり役に立ちません。

余談ですが、私も聞きたいのですが、レシーバー側でjson文字列を適切に消費できるように、response.writeの前にut8 bomを追加する必要がありますか?

前述の 2 つの JSON シリアライザーのいずれかを使用し、結果の JSON を直接応答ストリームに書き込むと、この文字が追加されます。

于 2013-01-24T06:49:56.163 に答える