【问题标题】:ASP.NET JavaScriptSerializer requires HttpResponse?ASP.NET JavaScriptSerializer 需要 HttpResponse?
【发布时间】:2010-10-07 19:51:41
【问题描述】:

似乎 System.Web.Script.Serialization.JavascriptSerializer 类试图获取当前请求的 HttpResponse,大概是为了应用适当的字符编码。

然而,这意味着当您使用没有 HttpContext 范围内的类时,它会因以下异常 + 堆栈跟踪而崩溃:

[HttpException (0x80004005): Response is not available in this context.]
   System.Web.HttpContext.get_Response() +8753496
   System.Web.Util.HttpEncoder.get_Current() +39
   System.Web.HttpUtility.JavaScriptStringEncode(String value, Boolean addDoubleQuotes) +13
   System.Web.Script.Serialization.JavaScriptSerializer.SerializeString(String input, StringBuilder sb) +31
   System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +240
   System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +1355
   System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat) +194
   System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, StringBuilder output, SerializationFormat serializationFormat) +26
   System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, SerializationFormat serializationFormat) +74
   System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj) +6

我无法以保证存在有效 HttpContext 的方式重新编写代码。关于如何避免这种情况的任何想法? String 类型的自定义 JavascriptConverter 可能是一个健壮的解决方案吗?

谢谢

帕斯卡

【问题讨论】:

    标签: c# asp.net json httpresponse


    【解决方案1】:

    AFAIK JavaScriptSerializer 不需要任何 HttpContext 并且在控制台应用程序中工作得非常好:

    class Program
    {
        static void Main(string[] args)
        {
            string json = new JavaScriptSerializer().Serialize(new { Bar = "foo" });
            Console.WriteLine(json);
        }
    }
    

    你也可以试试Json.NET

    【讨论】:

    • 有趣。也许它试图确定一个 HttpContext 是否可用,如果是,它还假设 HttpResponse 的可用性?如果在没有任何 HttpContext 时它可以工作,我可以将它移动到 HttpContext 和 HttpResponse 都可用的地方。我会试试的。
    • 没错。而已。如果 HttpContext.Current 不为 null,则假定 HttpContext.Current.Response 不为 null。
    • 其实好像是个bug。从反射器来看,实际代码似乎是“if (null != current && null != current.Response && ...)”,其中 current 是当前的 http 上下文。这里的问题是 Response getter 抛出异常,而不是返回 null。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2012-03-05
    相关资源
    最近更新 更多