状況
簡単そうに見えます: IIS 7 で実行されているサービスがあります。クライアントがデータ (application/json) をポストし、それを受け入れる前にデータを検証します。
私がそれを受け入れない場合は、406 と ~同じ~ データを body として返したかった (潜在的に変更/修正された) [1]。残念ながら、これは無効な json とも呼ばれる切り捨てられた応答本文につながります。
まず、エラーのパススルーを有効にします。そうしないと、IIS が巧妙になろうとするためです。
<httpErrors errorMode="Detailed" existingResponse="PassThrough">
</httpErrors>
私のコードの関連部分は、これと道徳的に同等のことを行います:
HttpResponseBase response = context.HttpContext.Response;
response.StatusCode = StatusCode;
response.StatusDescription = StatusDescription;
if (!string.IsNullOrEmpty(ContentType))
response.ContentType = ContentType;
else
response.ContentType = "application/json";
if (ContentEncoding != null)
response.ContentEncoding = ContentEncoding;
using (var sw = new StreamWriter(response.OutputStream))
{
sw.Write(JsonConvert.SerializeObject(Data));
}
クライアント側では、現在ナイーブを行っています(jsonの切り捨ての問題を見つけるため)
var response = myRestClient.Execute(myRestRequest);
問題
応答がステータス コード 200 を返す場合、これを取得します
response.ContentLength == 69345
response.RawBytes.Length == 69345
返されたステータス コード (私の場合は 406 に)だけを変更し、まったく同じデータを返すと、次のように表示されます。
response.ContentLength == 69345
response.RawBytes.Length == 65536 // <--- Not! Good!
さて、65536 はあまりにも魔法の数であり、宇宙線の一致または非常に再現可能な結果ではありません。unsigned short の長さを超えた場合にデータを捨てて、賢くしようとしているのは誰ですか? 今すぐ RestSharp コードベースに飛び込んでみますが、IIS が再びだまされているのではないかと本当に疑っています..
1: これが悪い考えだとしたら、その理由を詳しく教えてください。