6

jQueryが使用するために正しくラップされたJSONP値を出力しようとしています。

私が探している出力は次のとおりです。

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

しかし、それが出力しているATM:

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

明らかに、jQueryリクエストはレスポンスを処理できないため、これは正しいJSONP形式ではありません。

C#での私のOperationContractは次のとおりです。

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

を使用して、名前空間JSON.NETも使用してみました。System.Web.ScriptJavaScriptSerializer

しかし、私が実際にやりたいのは、2つの二重引用符を取り除くことだけです。

4

2 に答える 2

11

jQuery を使用して ajax リクエストを送信し、 を要求する場合dataType: "jsonp"、jQuery はリクエストでコールバック関数の名前 (例: /returndata?s=hello&callback=jquery123456789) を渡すため、その場合、定数 "jsonCallback" を返すことはできません。

また、あなたの質問では、操作コントラクト定義が返さStreamれていますが、操作自体では返されていますstring-何かが間違っています。

必要なこと: 2 つのオプションがあります。1 つ目は、WCF に JSONP パディングを処理させることです。あなたの操作は、プロパティ「ステータス」を持つデータ型を返す必要があり、それを返すだけです。CrossDomainScriptAccessEnabledまた、エンドポイントで使用される WebHttpBindingのプロパティを有効にする必要があります。操作は次のコードのようになります。

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

JSONP コードを自分で作成する場合の 2 番目のオプションは、コールバック関数名の URI に追加のパラメーターを取得し、応答を作成するときにそれを使用することです。Streamまた、応答を文字列として取得しないように、それを として返す必要があります (これはおそらく現在持っているものです)。それは次のようになります。

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

この jQuery コードを使用して、このサービスにアクセスできます。

    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);
            }
        });
    }
于 2012-06-19T00:53:26.160 に答える
1

WCF 呼び出しからの出力を評価する必要があります。このフィドルを参照してください。

WCF 呼び出しから文字列が返されます。基本的に、コンパイルしてから実行する必要があります。

フィドルのコードは次のとおりです。

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

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

js変数は、WCF 呼び出しからの出力です。すぐにeval、コンパイルして実行します。

于 2012-06-18T21:03:41.900 に答える