1

jquery から呼び出すことができる単純な WCF REST サービスをセットアップしようとしています。ブラウザでその URL にアクセスすると、応答が返ってきます。(Firefox プラグイン RESTClient を使用して) HTTPRequest を直接送信しようとすると、応答が返されます。これらの応答は、ヘッダーと JSON の文字列を含み、他には何も含まれていないように見えます。

ただし、jquery.get() または jquery.post() 呼び出しを介してこの同じサービスを呼び出すと、何も起こりません。jquery.ajax() 呼び出しを使用すると、エラー コールバックが呼び出されることがわかりますが、エラー コールバックに渡されたデータから、これが機能しない理由の手がかりが得られません。

<a id="thelink" href="javascript:void(0)">GO</a>
<script type="text/javascript">
    function doAjax() {
        $.ajax({type: "POST",
                dataType: "json", // see note below
                url: "http://localhost:54459/MySimpleService.svc/json/24",
                success: function(jqXHR, textStatus) {
                             alert("success");
                         },
                error: function(jqXHR, textStatus, errorThrown) {
                             alert("error");
                         }
               });
        }
    $('#thelink').click(doAjax);
</script> 

注:dataTypeパラメーターについては、「text」、「json」、「jsonp」のすべてを試し、パラメーターをオフのままにしました。同様に、GET と POST の両方を試しました (それぞれ GET または POST に応答するように Web サービスを変更します)。

そのエンドポイントで呼び出されたメソッドは、失敗するはずの素晴らしいことは何もしません-文字列を定数に連結して返すだけです(この時点でテストしているだけで、将来もっと興味深いことを明らかにするでしょう)

リンクをクリックすると、Firefox で 200 OK が表示されます。

Visual Studio 2010 デバッグ環境で WCF サービスが実行されています。このサービス メソッドに応答するメソッドに配置されたブレークポイントにヒットします。

ローカル マシン (ポート 80) 上のファイルから上記の html にアクセスし、別の場所でホストしようとしましたが、結果は同じでした。これはセキュリティ上の問題でしょうか?

エラー コールバックに渡される値はあまり役に立ちません。

  • jqXHR - readyState: 0、ステータス: 0、statusText: エラー
  • textStatus - 「エラー」
  • errorThrow - ""

では、ブラウザまたは RESTClient で URL を呼び出すと、GET または POST でサービスが機能しているように見えるのに、jquery.ajax() から呼び出そうとすると失敗するのはなぜですか?

編集:受け取ったコメントに基づいてさらにテストした後、Web サービスと同じポートで JavaScript を使用してページをホストしようとしましたが、これは成功を示しています。私の現実のシナリオでは、クライアント側のコードと Web サービスを同じドメイン/ポートでホストする余裕はありません。これはセキュリティ モデルの問題であると想定しています。この種のアクセスを許可するにはどこを見ればよいでしょうか (ドメイン/ポートのホワイトリスト登録など)。

4

2 に答える 2

1

問題は私の web.config にあるようです。コメントで解決したように、この問題はクロスドメイン セキュリティの 1 つです。エンドポイントで既に webHttpBinding を使用していましたが、構成する必要があることに気づきませんでした。

<system.serviceModel>
    <bindings>
        <webHttpBinding>
            <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true"/>
        </webHttpBinding>
    </bindings>
    ...
</system.serviceModel>

設定crossDomainScriptAccessEnabled="true"はうまくいったようです。<serviceMetadata httpGetEnabled="true"/>サービス動作の一部として既に持っていることに注意してください。

于 2012-12-04T14:39:20.623 に答える
0

サービスがスクリプト クライアントから呼び出されるように構成済みであることを確認します。サービスの web.config にいくつかの要素を追加します。

<behaviors>
 <endpointBehaviors>
  <behavior name="webScriptEnablingBehavior">
  <enableWebScript/>
 </behavior>
</endpointBehaviors>

詳細はこちら: http://msdn.microsoft.com/en-us/library/bb763177(v=vs.90).aspx

それが役に立てば幸い、

于 2012-11-29T21:29:21.113 に答える