2012-06-18 22 views
6

Estoy intentando generar un valor JSONP envuelto correctamente para que consuma jQuery.Devolver JSONP en el formato correcto WCF

La salida que estoy buscando es:

jsoncallback({"Status": "OK"}) 

Pero el cajero automático que está dando salida:

"jsoncallback({"Status": "OK"})" 

Evidentemente esto no está en formato correcto JSONP como la solicitud de jQuery no puede manejar la respuesta.

Mi OperationContract en C# es:

[OperationContract] 
[WebInvoke(Method = "GET", 
    ResponseFormat = WebMessageFormat.Json, 
    UriTemplate = "returndata?s={s}")] 
Stream EchoWithGet(string s); 

    public string EchoWithGet(string s) 
    { 
     string json = @"jsoncallback({'Status':'OK'})"; 
     Console.WriteLine("Call Made: " + s); 
     return json; 
    } 

He intentado usar JSON.NET y también el espacio de nombres System.Web.Script utilizar el JavaScriptSerializer.

Pero nada funciona para mí todo lo que realmente quiero hacer es deshacerme de dos comillas dobles.

+0

lo que es WPF tiene que ver con esto? –

+0

Estoy usando el entorno WPF, así que quiero atenderlo.Normalmente terminaría recibiendo respuestas relacionadas con ASP donde no ayudaría –

Respuesta

11

Si vas a enviar una petición AJAX con jQuery y pide dataType: "jsonp", jQuery pasará un nombre para la función de devolución de llamada en la solicitud (por ejemplo, /returndata?s=hello&callback=jquery123456789), por lo que el retorno de una constante "jsonCallback" no va a funcionar en ese caso .

Además, en su pregunta tiene la definición del contrato de operación que devuelve Stream, mientras que en la operación en sí está devolviendo string - algo está mal allí.

Lo que necesita hacer: tiene dos opciones. El primero es dejar que WCF maneje el relleno JSONP por usted. Su operación necesitaría devolver un tipo de datos con una propiedad "Estado", y simplemente devolverlo. También necesitaría habilitar la propiedad CrossDomainScriptAccessEnabled en la WebHttpBinding utilizada por su endpoint. Su funcionamiento sería algo como el código de abajo:

public class MyType 
{ 
    public string Status { get; set; } 
} 

[ServiceContract] 
public class Service 
{ 
    [WebGet(UriTemplate = "returndata?s={s}")] 
    public MyType ReturnData(string s) 
    { 
     return new MyType { Status = "OK" }; 
    } 
} 

La segunda opción, si desea crear el código JSONP mismo, sería tomar un parámetro adicional en el URI para el nombre de la función de devolución de llamada, luego usarlo al crear tu respuesta. También necesitaría devolverlo como Stream, para que no obtenga la respuesta como una cadena (que probablemente sea lo que tiene ahora). Que se vería así:

[ServiceContract] 
public class Service 
{ 
    [WebGet(UriTemplate = "ReturnData?s={s}&callback={callbackFunctionName}")] 
    public Stream EchoWithGet(string s, string callbackFunctionName) 
    { 
     string jsCode = callbackFunctionName + "({\"Status\":\"OK\"});"; 
     WebOperationContext.Current.OutgoingResponse.ContentType = "application/javascript"; 
     return new MemoryStream(Encoding.UTF8.GetBytes(jsCode)); 
    } 
} 

Y este código jQuery puede ser utilizado para acceder a este servicio:

function StackOverflow_11090835_Test() { 
     var url = "/StackOverflow_11090835.svc/ReturnData"; 
     var data = { s: "Hello world" }; 
     $.ajax({ 
      type: 'GET', 
      url: url, 
      data: data, 
      dataType: "jsonp", 
      success: function (result) { 
       $("#result").text(result.Status); 
      } 
     }); 
    } 
+0

Gracias por esto, este podría ser el problema al que me estoy enfrentando, y lo siento por el error de Stream DataType, en realidad fue un error ya que estaba jugando con el código. Voy a probar esto esta noche y ver qué pasa. Gracias de nuevo –

+0

¡Funciona muy bien! Muchas gracias, después de 10 horas de investigación, finalmente lo logré. –

+0

No entiendo la primera opción. ¿Cómo maneja WCF el relleno JSONP por usted? ¿Y por qué el enlace requiere 'CrossDomainScriptAccessEnabled' pero la opción 2 no? – xr280xr

1

Necesita evaluar la salida de su llamada WCF. Vea esto fiddle.

Usted está recibiendo una cadena de su llamada a WCF. Básicamente, necesitas compilarlo y luego ejecutarlo.

Aquí está el código del violín:

function jsonCallback(obj){ 
    alert(obj.Status); 
} 

$(document).ready(function(){ 
    var js = "jsonCallback({'Status':'OK'})"; 
    eval(js); 
});​ 

La variable js es su salida de la llamada WCF. Tan pronto como yo eval, se compilará y ejecutará.

+0

Hola, gracias por los consejos, pero no creo que eso responda a mi pregunta como '' jsoncallback ({"Estado": "OK"}) " 'ni siquiera lo está mirando jQuery –

Cuestiones relacionadas