2011-12-18 23 views
9

Quiero devolver datos JSON de vuelta al cliente, en mi método de servicio Web. Una forma es crear SoapExtension y usarlo como atributo en mi método web, etc. Otra forma es simplemente agregar el atributo [ScriptService] al servicio web, y dejar que .NET framework devuelva el resultado como {"d": "something"} JSON, de vuelta al usuario (d aquí) siendo algo fuera de mi control). Sin embargo, quiero devolver algo como:Response.Write() en WebService

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

El enfoque más simple podría estar escribiendo un método web como:

[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!\"}}"); 
    } 
} 

De esta manera, lo voy a conseguir al cliente es:

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

Lo que significa que ASP.NET agrega su resultado de éxito a mi resultado JSON. Si por el contrario me ruborizo ​​la respuesta después de escribir el mensaje de éxito, (como response.Flush();), a excepción ocurre que dice:

Server no puede haber sido enviado cabeceras claro después de las cabeceras HTTP.

Entonces, ¿qué hacer para obtener mi resultado JSON, sin cambiar el enfoque?

+0

Inténtelo de response.BufferOutput = true; –

Respuesta

2

¿Por qué no devolver un objeto y luego en su cliente puede llamar como response.d?

No sé cómo se llama su servicio web pero hice un ejemplo hacer algunas suposiciones:

Hice este ejemplo usando 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)); 

        } 
       }); 
      } 

Y su código podría ser como este (es necesario para permitir que el servicio web para ser llamado desde el guión primero: '[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; 
    } 

En este ejemplo he utilizado diccionario, pero yo Podría usar cualquier objeto con un "mensaje" de campo, por ejemplo.

Lo siento si me Missunderstood lo que quería decir pero no entiendo muy bien por qué quiere hacer una cosa 'response.write'.

esperanza he ayudado al menos. :)

10

Esto funciona para mí:

[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

estas líneas me ayudaron, pero para mí han añadido estas líneas para que se trabaja Response.Flush(); Response.End(); –

+1

ResponseEnd() causa "El hilo estaba siendo abortado" ¡Esto funciona para mí! 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