2010-10-07 6 views
3

Il semble que la classe System.Web.Script.Serialization.JavascriptSerializer tente d'obtenir HttpResponse pour la requête en cours, vraisemblablement pour appliquer un codage de caractères approprié.ASP.NET JavaScriptSerializer nécessite HttpResponse?

Cependant, cela signifie que lorsque vous d'utiliser la classe sans HttpContext portée, il explose à l'exception suivante + trace de pile:

[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 

Je ne peux pas retravailler le code de telle manière à garantir l'existence d'un HttpContext valide. Des idées sur la façon d'éviter cela? Un JavascriptConverter personnalisé pour le type String pourrait-il être une solution robuste?

Merci

Pascal

Répondre

4

AFAIK JavaScriptSerializer ne nécessite pas de HttpContext et fonctionne parfaitement bien dans une application console:

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

Vous pouvez également essayer Json.NET.

+0

Intéressant. Peut-être essaie-t-il de déterminer si un HttpContext est disponible, et si c'est le cas, il suppose également la disponibilité de HttpResponse? Je peux déplacer ceci à un endroit où HttpContext et HttpResponse sont disponibles si cela fonctionnera quand il n'y a aucun HttpContext que ce soit. Je vais essayer ça. – Pascal

+1

Exactement. C'est tout. Si HttpContext.Current n'est pas nul, il suppose que HttpContext.Current.Response n'est pas nul. –

+0

En fait, il semble que ce soit un bug. A partir du réflecteur, le code réel semble être "if (null! = Current && null! = Current.Response && ...)" où current est le contexte http actuel. Le problème est que Response getter lève une exception au lieu de retourner null. – VinayC

Questions connexes