2012-04-23 67 views
0

jQuery(v 1.7.2)で使用しようとしているWCF JSONPサービスがあります。JSONP + jQuery:エラー80020101のため操作を完了できませんでした

サーバー側のコード:

[OperationContract] 
[WebGet(BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] 

[JSONPBehavior(callback = "method")] 
List<string> GetList() 
{ 
    return new List<string> {"test1", "test2"}; 
} 

クライアント側コード:

される何が起こる
function showList() 
    { 
     $.ajax({ 
      url: 'http://mysite/myservice.svc/GetList', 
      dataType: 'jsonp', 
      data: { }, 
      contentType: "application/json", 
      success: function (m) 
      { 
       debugger; 
      }, 
      error: function (err) 
      { 
       debugger; 
      } 
      }); 
     } 

: 'エラー' コールバックが呼ばれ、私はerrパラメータをチェックしたときに、そのerr.responseTextが正しいJSONレスポンスが含まれています:{"GetListResult":["test1","test2"]}

何が起こっているのかを見るために、私はjQuery自体のデバッグに行きました。私はそれがfai結果をajaxConvertの方法に変換するには:

jQuery 1.7.2(最小化しない)、行7511:success = ajaxConvert(s, response);これらの例外Could not complete the operation due to error 80020101.

私がajaxConvertを通過すると、上記の例外をスローするjQuery.globalEval(response)を実行しようとしています。

私は間違って何をしていますか?

+0

に役立ちます願っていますが、あなたの 'dataType'が "JSONP" であるべきか?それを "json"に設定するとどうなりますか?私はあなたがjsonpをやっているとは思わない。 http://en.wikipedia.org/wiki/JSONPを参照してください – Cheeso

+0

クロスドメインコールを行う必要があります - wcfサービスはクライアントページとは別のドメインにあります。したがって私はJSONP呼び出しが必要です。 – Andrey

+0

ああ、私の誤解。 – Cheeso

答えて

0

JSON出力がコールバック関数にラップされていますか? JSONPの重要な部分は、javascriptスコープで実行される関数にjsonデータを渡すことです。

関数の名前は、要求がなければなりません。すなわち、jQueryのことで自動的にリクエストURLに付加する必要があります。

jQuery_random1231({ key: 'value', key1: 'value1' .. }); 

明らかにあなたのバックエンド:http://mysite/myservice.svc/GetList?callback=jQuery_random1231

その後、あなたのJSONPの出力は、このする必要がありますこれに対応しなければならない。

0

あなたのサービスがJSONPを返すのではなく、代わりにJSONを返すことが問題だと思います。 eval関数は文字列をJavaScriptコードとして評価しようとします。JSONP形式の場合、関数は評価に成功します。実際のJSONP応答は、method({"GetListResult":["test1"、 "test2"]})でなければなりません。

私はあなたがそれが正しく動作するかどうかを確認するために行動をデバッグしようとすることができますMSDN sample here.

からJSONPBehaviorを使用していることとします。個人的には、生ストリームをJSONPにシリアル化する際にこのクラスに関する問題がありました。

.NET 4にいる場合は、この動作をこれ以上使用する必要はありません。あなたは試してみてください

<binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" /> 

他の事はgetJson方法の代わりに、Ajaxの方法を使用することです:あなたは代わりにweb.configファイルに結合の構成を変更することができます。私はJSONPでそれを使用しています。

乾杯、 月

+0

あなたは正しいです、私はその例を使用しています。残念ながら.NET 4.0は使用できません。だから、もし私がgetJSON()を使っていても、それはクロスドメインで動作しますか? – Andrey

+0

はい私のシナリオでは、crossdomain呼び出しのためにgetJson()を使用します。しかし、私はそれがより多くのサーバー側の問題だと思う。 Chromeを使用してJSONPが正しく返されることを検証することも、純粋なJSONが返されることを確認することもできます。サーバーがJSONPを返すことが確かであれば、jQueryのデバッグ:)に移動します。しかし前にはない – hoonzis

+0

応答はJSON文字列なので、サーバーがJSONを返すようです。私はマイクロソフトの例に従ったが、何が間違っているかはわからない – Andrey

0

あなたはまだ解決策として見つかった場合、私は知らないが、これは役立つかもしれません。私は同じ問題を抱え、デバッガで物事を追跡しました。私は最終的に原因がクエリ文字列パラメータであることを発見しました。私がwebserviceコールからquerystringパラメータを削除すると、すべて機能しました。私は、これは

http://senseicris.wordpress.com/2012/05/19/jquery-error-80020101-a-fix

関連する問題