我配置了一个大型WebAPI,它使用Newtonsoft JSON.NET序列化程序将JSON返回给客户端。
有时响应可能非常大(> 100mb),这会导致浏览器崩溃。我宁愿通过抛出异常或采取其他行动来处理它,而不是返回这些大的结果。我无法找到检测这种情况的方法。
我尝试的第一件事就是将其添加到我的Web.Config
文件中:
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="50000000"/>
</webServices>
</scripting>
</system.web.extensions>
但是,似乎此设置仅适用于MVC,对WebAPI和Newtonsoft没有影响。
接下来我尝试用ExecuteAsync中的标题读取ContentLength
:
public override Task<HttpResponseMessage> ExecuteAsync(System.Web.Http.Controllers.HttpControllerContext controllerContext, System.Threading.CancellationToken cancellationToken)
{
Task<HttpResponseMessage> task = base.ExecuteAsync(controllerContext, cancellationToken);
task.GetAwaiter().OnCompleted(() =>
{
if (task.Status == TaskStatus.RanToCompletion)
{
// Check the size.
long? resultLength = task.Result.Content.Headers.ContentLength;
// This is always 0.
}
});
return task;
}
但值始终为0.
我注意到有关可能使用DelegatingHandler
的帖子:
Capture the size of the response (in bytes) of a WebAPI method call
但我真的不喜欢在将整个缓冲区发送到客户端之前将其加载到内存中。
真的没办法做到这一点吗?看起来很奇怪。