2012-06-18 11 views
6

Ich versuche, einen korrekt umgebrochenen JSONP-Wert auszugeben, den jQuery konsumieren soll.Geben Sie JSONP im richtigen Format zurück. WCF

Der Ausgang ich suche ist:

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

Aber die atm es ausgibt:

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

offenbar in der richtigen JSONP Format wie die jQuery Anfrage kann dies nicht nicht den Griff Antwort.

Meine Operation in C# ist:

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

Ich habe versucht, mit JSON.NET und auch die System.Web.Script Namespace die JavaScriptSerializer zu verwenden.

Aber nichts funktioniert für mich alles, was ich eigentlich tun möchte, ist, zwei doppelte Anführungszeichen loszuwerden.

+0

was ist wpf damit zu tun? –

+0

Ich verwende die WPF-Umgebung, also möchte ich darauf eingehen.Normalerweise würde ich am Ende Antworten auf ASP bekommen, wo es nicht helfen würde –

Antwort

11

Wenn Sie einen Ajax-Request mit jQuery sind die Vorlage und fragen nach dataType: "jsonp", jQuery wird einen Namen für die Callback-Funktion in der Anfrage übergibt (zB /returndata?s=hello&callback=jquery123456789), so einen konstanten „jsonCallback“ Rückkehr wird in diesem Fall nicht funktionieren .

Auch in Ihrer Frage haben Sie die Operation Vertragsdefinition Stream zurück, während auf der Operation selbst Sie zurückgeben string - etwas ist falsch dort.

Was Sie tun müssen: Sie haben zwei Möglichkeiten. Der erste Schritt ist, dass WCF das JSONP-Padding für Sie übernimmt. Ihre Operation müsste einen Datentyp mit der Eigenschaft "Status" zurückgeben und einfach zurückgeben. Sie müssen auch die -Eigenschaft in der von Ihrem Endpunkt verwendeten WebHttpBinding-Funktion aktivieren. Ihr Betrieb würde unter so etwas wie der Code aussehen:

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

Die zweite Option, wenn Sie den JSONP Code selbst erstellen möchten, wäre für die Callback-Funktion Namen einen zusätzlichen Parameter in der URI zu nehmen, dann verwenden, wenn Sie Ihre Antwort erstellen. Sie müssen es auch als Stream zurückgeben, so dass Sie die Antwort nicht als Zeichenfolge erhalten (was wahrscheinlich ist, was Sie gerade haben). Das würde wie folgt aussehen:

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

Und dieser Code jQuery kann verwendet werden, diesen Dienst zuzugreifen:

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

Danke dafür, dies könnte das Problem sein, dem ich gegenüberstehe, und sorry über den Stream DataType Fehler, es war tatsächlich ein Fehler, da ich mit Code herumspielte. Ich werde es heute Abend versuchen und sehen, was passiert. Danke nochmal –

+0

Funktioniert super! Vielen Dank, nach 10 Stunden Recherche habe ich es endlich geschafft. –

+0

Ich verstehe die erste Option nicht. Wie behandelt WCF das JSONP-Padding für Sie? Und warum benötigt die Bindung 'CrossDomainScriptAccessEnabled', aber Option 2 nicht? – xr280xr

1

Sie müssen die Ausgabe von Ihrem WCF-Aufruf überprüfen. Siehe hierzu fiddle.

Sie erhalten eine Zeichenfolge von Ihrem WCF-Anruf zurück. Sie müssen es im Wesentlichen kompilieren und dann ausführen.

Hier ist der Code von der Geige:

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

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

Die js Variable ist die Ausgabe von der WCF-Aufruf. Sobald ich es eval it, wird es kompilieren und ausführen.

+0

Hallo Danke für die Hinweise, aber ich glaube nicht, dass meine Frage als "jsoncallback ({" Status ":" OK "}) beantwortet." '' wird nicht einmal von jQuery angeschaut –

Verwandte Themen