【发布时间】:2012-05-09 16:11:47
【问题描述】:
情况
看起来很简单:我有一个在 IIS 7 上运行的服务。客户端发布数据(应用程序/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
如果我更改 nothing 而是返回状态码(在我的情况下为 406),返回 非常相同的数据,我会看到:
response.ContentLength == 69345
response.RawBytes.Length == 65536 // <--- Not! Good!
现在,65536 这个数字太神奇了,不可能是宇宙射线的巧合或非常可重现的结果。谁在现在试图变得聪明并在我的数据长度超过无符号短时丢弃我的数据?我现在会尝试深入研究 RestSharp 代码库,但我真的很怀疑 IIS 又在愚弄我..
1:如果这是一个坏主意,请详细说明原因?
【问题讨论】:
-
实际内容是否被截断?
-
是的,内容被截断。但是RestSharp(谢谢,顺便说一句!)不是我所看到的。我真的只是通过线路接收到那个字节数(根据 Fiddler 的说法)。
-
嗯,我有一个类似的问题,但提琴手显示了从 Tomcat 服务器返回的完整 JSON 内容 - 你有没有得到任何地方?
-
据我所知,RestSharp 使用 HttpWebRequest,其中 DefaultMaximumErrorResponseLength 的默认值为 65536。所以我想这就是你的幻数的来源。
标签: c# asp.net-mvc-3 iis iis-7 restsharp