JQueryを使用して別のドメインにある私のサービスを呼び出してプレイしています。サービスへの呼び出しが正常に行われ(デバッグポイントがトリップする)、正しい応答が返されます(トラフィックを傍受します)。
私の問題は、主に成功と失敗のコールバックが発生しないことです。私はいくつかの その他の投稿 を読みましたSOこれは、JSONPを使用するときにエラーイベントが発生しないことを示しています。それは成功イベントのケースですか(おそらく私自身のコールバック関数を提供していることも)、または私の成功コールバックを起動する方法があります。
$.ajax({
type: "GET",
url: urlOnDiffDomain,
async: false,
cache: false,
dataType: 'jsonp',
data: {},
success: function(data, textStatus) {
alert('success...');
},
error: function(xhr, ajaxOptions, thrownError) {
alert('failed....');
}
});
よし。誰かが将来知っておく必要がある場合...後から考えると、解決策はおそらくそれよりも明白であるはずですが、Web応答で応答に直接書き込む必要があります stream。 JSONの文字列を返すだけでは機能せず、誰かがそれを作成してストリーミングする必要があります。私の元の投稿のコードは、実際にそうすれば問題なく動作します。
サービスコードの例:
public void DoWork()
{
//it will work without this, but just to be safe
HttpContext.Current.Response.ContentType = "application/json";
string qs = HttpContext.Current.Request.QueryString["callback"];
HttpContext.Current.Response.Write(qs + "( [{ \"x\": 10, \"y\": 15}] )");
}
明確にするために、これはクライアント側のコードです。
function localDemo(){
$.getJSON("http://someOtherDomain.com/Service1.svc/DoWork?callback=?",
function(data){
$.each(data, function(i,item){
alert(item.x);
});
});
}
これを行うためのより良い方法がある場合、私はすべて耳です。他のすべての人にとって、JSONPのWCF 4.0にネイティブサポートの概念があることは知っています。また、セキュリティの目的で checking を少し実行することもできます。
success
コールバックメソッドは、サーバーが応答すると呼び出されます。 $.ajax
メソッドは、success
コールバックメソッドを呼び出して応答を処理する関数を設定します。
success
メソッドが呼び出されない最も可能性の高い理由は、サーバーからの応答が正しくないことです。 $.ajax
メソッドは、サーバーがJSONP応答で関数名として使用する必要があるcallback
クエリ文字列の値を送信します。サーバーが別の名前を使用している場合、$.ajax
メソッドが設定した関数が呼び出されることはありません。
サーバーがcallback
クエリ文字列の値を使用して応答に関数名を設定できない場合は、$.ajax
メソッドがサーバーから期待する関数名を指定できます。プロパティjsonpCallback
をオプションオブジェクトに追加し、値をサーバーが応答で使用する関数の名前に設定します。
たとえば、$.ajax
メソッドがURL http://service.mydomain.com/getdata?callback=jsonp12345
を使用してサーバーにリクエストを送信している場合、サーバーは次のような応答を返します。
jsonp12345({...});
サーバーがcallback
クエリ文字列を無視し、代わりに次のような応答を返す場合:
mycallback({...});
次に、オプションオブジェクトにプロパティを追加して、関数名をオーバーライドする必要があります。
$.ajax({
url: urlOnDiffDomain,
dataType: 'jsonp',
data: {},
success: function(data, textStatus) {
alert('success...');
},
jsonpCallback: 'mycallback'
});
これはあなたの質問に対する完全な答えではありませんが、通り過ぎる人はこれを知りたいと思います:
JSONP from WCF REST を使用する場合は、次のように使用してください。
[JavascriptCallbackBehavior(UrlParameterName = "$callback")]
サービスの実装。これにより、すぐにJSONPが提供されます。
試す
$.getJSON(urlOnDiffDomain, function(data, textStatus){
alert('success...');
});
通常、私のために働く。 &callback =?を追加する必要がありますjQueryはJSONPで使用されるコールバックを自動的に置き換えます。
エラーコールバックはトリガーされませんが、次のようにグローバル$ .ajaxErrorを使用できます
$('.somenode').ajaxError(function(e, xhr, settings, exception) {
alert('failed');
});
$.ajax({
url:' <?php echo URL::site('ajax/editing?action=artistSeracher') ?>',
dataType: "json",
data: {
featureClass: "P",
style: "full",
maxRows: 12,
artist: request.term
},
success: function( data ) {
response( $.map( data, function( item ) {
return {
label: item.artist,
value: item.artist,
id: item.id
}
}));
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});