首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringWriter内存越界异常

StringWriter内存越界异常
EN

Stack Overflow用户
提问于 2015-11-09 02:30:04
回答 1查看 877关注 0票数 0

我有一个方法ExecuteResult,它在行Response.Write(sw.ToString())中抛出一个System.OutOfMemoryException。之所以发生这种情况,是因为StringWriter对象对ToString来说内存太大;它填满了内存。

我一直在寻找一个解决方案,但似乎找不到一个简单、干净的解决方案。任何想法都将不胜感激。

代码:

代码语言:javascript
复制
public class JsonNetResult : JsonResult
{
    public JsonNetResult()
    {
        Settings = new JsonSerializerSettings
        {
            ReferenceLoopHandling = ReferenceLoopHandling.Error
        };
    }

    public JsonSerializerSettings Settings { get; private set; }

    public override void ExecuteResult(ControllerContext context)
    {
        if (this.Data != null)
        {
            if (context == null)
                throw new ArgumentNullException("context");
            if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
                throw new InvalidOperationException("JSON GET is not allowed");

            HttpResponseBase response = context.HttpContext.Response;
            response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;

            if (this.ContentEncoding != null)
                response.ContentEncoding = this.ContentEncoding;


            var scriptSerializer = JsonSerializer.Create(this.Settings);

            using (var sw = new StringWriter())
            {
                    scriptSerializer.Serialize(sw, this.Data);
                    //outofmemory exception is happening here
                    response.Write(sw.ToString());
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-09 02:54:11

我认为问题在于,您正在将所有JSON缓冲到一个StringWriter中,然后尝试将它写成一个大块,而不是流到响应中。

尝试替换以下代码:

代码语言:javascript
复制
using (var sw = new StringWriter())
{
    scriptSerializer.Serialize(sw, this.Data);
    //outofmemory exception is happening here
    response.Write(sw.ToString());
}

在这方面:

代码语言:javascript
复制
using (StreamWriter sw = new StreamWriter(response.OutputStream, ContentEncoding))
using (JsonTextWriter jtw = new JsonTextWriter(sw))
{
    scriptSerializer.Serialize(jtw, this.Data);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33601609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档