2011-12-18 14 views
9

Desidero restituire i dati JSON al client, nel mio metodo di servizio web. Un modo è creare SoapExtension e usarlo come attributo sul mio metodo web, ecc. Un altro modo è semplicemente aggiungere l'attributo al servizio web e lasciare che .NET framework restituisca il risultato come {"d": "something"} JSON all'utente (d qui essere qualcosa fuori dal mio controllo). Tuttavia, voglio tornare qualcosa di simile:Response.Write() in WebService

{"message": "action was successful!"} 

L'approccio più semplice potrebbe essere scrivendo un metodo web come:

[WebMethod] 
public static void StopSite(int siteId) 
{ 
    HttpResponse response = HttpContext.Current.Response; 
    try 
    { 
     // Doing something here 
     response.Write("{{\"message\": \"action was successful!\"}}"); 
    } 
    catch (Exception ex) 
    { 
     response.StatusCode = 500; 
     response.Write("{{\"message\": \"action failed!\"}}"); 
    } 
} 

In questo modo, quello che vado a prendere al cliente è:

{ "message": "action was successful!"} { "d": null} 

Ciò significa che ASP.NET aggiunge il risultato di successo al mio risultato JSON. Se d'altra parte Arrossisco la risposta dopo aver scritto il messaggio di successo, (come response.Flush();), l'eccezione accade che dice:

Server può non chiare intestazioni dopo intestazioni HTTP sono stati inviati.

Quindi, cosa fare per ottenere il mio risultato JSON, senza modificare l'approccio?

+0

Prova a impostare response.BufferOutput = true; –

risposta

2

Perché non si restituisce un oggetto e quindi nel client è possibile chiamare come response.d?

Io non so come si sta chiamando il servizio Web, ma ho fatto un esempio facendo alcune ipotesi:

Ho fatto questo esempio utilizzando jQuery Ajax

function Test(a) { 

       $.ajax({ 
        type: "POST", 
        contentType: "application/json; charset=utf-8", 
        url: "TestRW.asmx/HelloWorld", 
        data: "{'id':" + a + "}", 
        dataType: "json", 
        success: function (response) { 
         alert(JSON.stringify(response.d)); 

        } 
       }); 
      } 

E il codice potrebbe essere simile a questo (è necessario per consentire al servizio web di essere chiamato da uno script prima: '[System.Web.Script.Services.ScriptService]'):

[WebMethod] 
    public object HelloWorld(int id) 
    { 
     Dictionary<string, string> dic = new Dictionary<string, string>(); 
     dic.Add("message","success"); 

     return dic; 
    } 

In questo esempio ho usato dizionario ma yo per esempio, potresti usare qualsiasi oggetto con un campo "messaggio".

Mi dispiace se ho capito male cosa intendevi, ma non capisco davvero perché vuoi fare una cosa 'response.write'.

Spero di averlo aiutato almeno. :)

10

questo funziona per me:

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public void ReturnExactValueFromWebMethod(string AuthCode) 
{ 
    string r = "return my exact response without ASP.NET added junk"; 
    HttpContext.Current.Response.BufferOutput = true; 
    HttpContext.Current.Response.Write(r); 
    HttpContext.Current.Response.Flush(); 
} 
+1

questa linea mi ha aiutato, ma per me ho aggiunto queste righe per farlo funzionare Response.Flush(); Response.End(); –

+1

ResponseEnd() causa "Il thread è stato interrotto" Questo funziona per me! HttpContext.Current.Response.Flush(); HttpContext.Current.Response.SuppressContent = true; HttpContext.Current.ApplicationInstance.CompleteRequest(); http://stackoverflow.com/questions/20988445/how-to-avoid-response-end-thread-was-being-aborted-exception-during-the-exce – Evilripper