ASP.NET的JavaScriptSerializer需要HttpResponse吗?

3

看起来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可能是一个强大的解决方案吗?

谢谢

Pascal

1个回答

4
据我所知,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,我可以将其移动到两者都可用的位置以使其正常工作。我会尝试一下。 - Pascal
1
没错,就是这样。如果HttpContext.Current不为空,则假定HttpContext.Current.Response也不为空。 - Darin Dimitrov
实际上,这似乎是一个错误。从反射器中可以看到,实际代码是“if (null!= current && null!= current.Response && ...)”,其中current是当前的HTTP上下文。问题在于Response getter会抛出异常,而不是返回null。 - VinayC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接