2012-06-18 18 views
6

Sto provando a generare un valore JSONP corretto per jQuery da consumare.Restituisce JSONP nel formato corretto WCF

L'uscita che sto cercando è:

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

Ma l'atm è l'output:

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

Evidentemente questo non è nel formato corretto JSONP come la richiesta di jQuery non può gestire il risposta.

mio OperationContract in C# è:

[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; 
    } 

Ho provato con JSON.NET e anche il System.Web.Script Namespace per utilizzare il JavaScriptSerializer.

Ma niente funziona per me tutto ciò che in realtà voglio fare è sbarazzarsi di due virgolette doppie.

+0

cosa c'è WPF ha a che fare con questo? –

+0

Sto usando l'ambiente WPF, quindi voglio soddisfarlo.Normalmente finirò per ottenere risposte relative ad ASP dove non sarebbe di aiuto –

risposta

11

Se stai presentando una richiesta Ajax con jQuery e chiede dataType: "jsonp", jQuery passerà un nome per la funzione di callback nella richiesta (ad esempio, /returndata?s=hello&callback=jquery123456789), in modo da restituire un costante "jsonCallback" non funzionerà in questo caso .

Inoltre, nella tua domanda hai la definizione del contratto operativo che restituisce Stream, mentre sull'operazione stessa stai restituendo string - qualcosa non va lì.

Cosa devi fare: hai due opzioni. Il primo è lasciare che WCF gestisca il riempimento JSONP per te. L'operazione dovrebbe restituire un tipo di dati con una proprietà "Stato" e restituirlo. Dovresti anche abilitare la proprietà CrossDomainScriptAccessEnabled sul WebHttpBinding utilizzato dal tuo endpoint. L'operazione sarebbe simile il codice qui sotto:

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 seconda opzione, se si desidera creare il codice JSONP da soli, sarebbe di prendere un parametro aggiuntivo nella URI per il nome della funzione di callback, quindi utilizzarlo quando crei la tua risposta. Dovresti anche restituirlo come Stream, in modo da non ricevere la risposta come una stringa (che probabilmente è ciò che hai adesso). Che sarebbe simile a questa:

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

E questo codice jQuery può essere utilizzato per accedere a questo servizio:

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

non è nemmeno guardato grazie. Grazie a ciò, questo potrebbe essere il problema che sto affrontando, e mi dispiace per l'errore Stream DataType, è stato in realtà un errore mentre stavo giocando con il codice. Darò questa prova stanotte e vedrò cosa succede. Grazie ancora –

+0

Funziona alla grande! Grazie mille, dopo 10 ore di ricerca l'ho finalmente gestito. –

+0

Non capisco la prima opzione. In che modo WCF gestisce il riempimento JSONP per te? E perché l'associazione richiede 'CrossDomainScriptAccessEnabled' ma l'opzione 2 no? – xr280xr

1

È necessario valutare l'output della chiamata WCF. Vedi questo fiddle.

Stai ricevendo una stringa dalla tua chiamata WCF. Devi essenzialmente compilarlo e poi eseguirlo.

Ecco il codice dal violino:

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

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

La variabile js è la vostra uscita dalla chiamata WCF. Non appena ho eval, verrà compilato ed eseguito.

+0

Ciao grazie per i suggerimenti ma non credo che risponda alla mia domanda come il "" jsoncallback ({"Status": "OK"}) " 'jQuery –

Problemi correlati