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