IIS 和 RestSharp -> 响应正文因 40x 错误而被切断

本文关键字:错误 40x 正文 RestSharp 响应 IIS | 更新日期: 2023-09-27 18:33:34

情况

看起来很简单:我有一个在 IIS 7 上运行的服务。客户端 POSTS 数据(应用程序/json(和我在接受数据之前对其进行验证。

如果我不接受它,我真的很想返回一个 406 和 ~same~ 数据作为正文(可能更改/更正([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是一个太神奇的数字,不可能是宇宙射线的重合或非常可重复的结果。现在谁在试图变得聪明,如果我的数据超过一个无符号的短篇长度,就会扔掉它?我现在将尝试深入研究 RestSharp 代码库,但我真的怀疑 IIS 再次愚弄我。

1:如果这是一个坏主意,请详细说明为什么?

IIS 和 RestSharp -> 响应正文因 40x 错误而被切断

看看这篇文章:RestSharp RestResponse 正在将内容截断为 64 kb

发生这种情况是因为RestSharp使用.NET Framework中的HttpWebRequest类。此类具有一个名为 DefaultMaximumErrorResponseLength 的静态属性。此属性确定错误响应的最大长度,此属性的默认值为 64Kb。