2010-03-12 7 views
0

J'ai un module HTTP que j'utilise pour nettoyer le JSON retourné par mon service web (voir http://www.codeproject.com/KB/webservices/ASPNET_JSONP.aspx?msg=3400287#xx3400287xx pour un exemple.) Fondamentalement, il s'agit d'appeler les services Web JSON interdomaines à partir de javascript.Json HTTP Module flux numéro

Il existe ce JsonHttpModule qui utilise une classe JsonResponseFilter Stream pour écrire le JSON et la méthode Write surchargée est supposée envelopper le nom de la fonction de rappel autour du JSON, sinon les erreurs JSON nécessitent un label. Cependant, si le JSON est vraiment long, la méthode Write de la classe Stream est appelée plusieurs fois, provoquant l'insertion incorrecte de la fonction de rappel à mi-chemin du JSON. Existe-t-il un moyen dans la classe Stream d'encapsuler la fonction de rappel autour du flux à la fin ou de spécifier qu'il écrit tout le JSON dans la méthode 1 Write au lieu de morceaux?

est ici où il appelle le JsonResponseFilter dans le JsonHttpModule:

public void OnReleaseRequestState(object sender, EventArgs e) 
     { 
      HttpApplication app = (HttpApplication)sender; 

      if (!_Apply(app.Context.Request)) return; 

      // apply response filter to conform to JSONP 
      app.Context.Response.Filter = 
       new JsonResponseFilter(app.Context.Response.Filter, app.Context); 
     } 

est ici la méthode Write dans la classe JsonResponseFilter Stream qui est appelée à plusieurs reprises:

public override void Write(byte[] buffer, int offset, int count) 
     { 
      var b1 = Encoding.UTF8.GetBytes(_context.Request.Params["callback"] + "("); 
      _responseStream.Write(b1, 0, b1.Length); 

      _responseStream.Write(buffer, offset, count); 

      var b2 = Encoding.UTF8.GetBytes(");"); 
      _responseStream.Write(b2, 0, b2.Length); 
     } 

Merci pour toute aide! Justin

Répondre

0

La raison pour laquelle la méthode est déclenchée plusieurs fois est parce qu'elle mettra le contenu en mémoire tampon, puis l'enverra au flux de sortie. Voici un exemple qui montre comment créer ViewState mover HttpModule. Vous pouvez avoir une idée de la mise en œuvre. Faites défiler vers le bas et voir le résultat.

http://www.highoncoding.com/Articles/464_Filtering_Responses_Using_ASP_NET_Response_Filters.aspx

+0

Merci, cet article m'a donné ce dont j'avais besoin! public override void Écrire (octet [] buffer, int offset, nombre entier) { chaîne json = System.Text.Encoding.UTF8.GetString (buffer, offset, count); _sb.Append (json); var endOfFile = new Regex ("]"); if (endOfFile.IsMatch (json)) { chaîne message = _context.Request.Params ["callback"] + "(" + _sb.ToString() + ");"; buffer = System.Text.Encoding.UTF8.GetBytes (message); _responseStream.Write (buffer, 0, buffer.Length); } } – Justin

+0

Génial! Heureux d'avoir pu aider! – azamsharp

0

Une autre solution consiste à écrire dans ResponseStream procédé de rinçage. Comme dans this exemple.

J'ai modifié la méthode JsonHttpModules Flush et utilisé StringBuilder pour stocker le flux dans la méthode Write comme Justin.

/// <summary> 
    /// Override flush by writing out the cached stream data 
    /// </summary> 
    public override void Flush() 
    { 

     if (_sb.Length > 0) 
     { 
      string message = _context.Request.Params["callback"] + "(" + _sb.ToString() + ");"; 
      byte[] buffer = System.Text.Encoding.UTF8.GetBytes(message); 
      _responseStream.Write(buffer, 0, buffer.Length); 
     } 

     // default flush behavior 
     _responseStream.Flush(); 
    } 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     string json = System.Text.Encoding.UTF8.GetString(buffer, offset, count); 
     _sb.Append(json); 
    } 

De cette façon, vous n'avez pas à essayer de deviner la fin du flux entrant.