4

jQuery から WCF メソッドを呼び出すときにエラーが発生します。ローカルホストに実装すると呼び出しは問題なく返されますが、サービスが別のサーバーでホストされているとアクセス拒否エラーがスローされます。

エラーを再現する手順は次のとおりです。

  1. プロジェクトをローカルで実行し、サービスが実行されているかどうかを確認します。例: http://localhost:3369/AppsterWcfService.svc/DoWork

  2. テスト クライアント (test.html) ページをローカルに作成し、このプロジェクトを実行します。ログインボタンをクリックすると、正常に動作します。

  3. リモート サーバーでサービスをホストし、URL を新しい URL、つまりホストされたサービスの URL に置き換えます。

  4. test.html ページを実行し、ボタンをクリックします。ここで、アクセス拒否エラーが発生します。

サーバーにアクセスするさまざまな方法を試しました。例:-

  1. MVC を使用して
  2. ハンドラ
  3. シンプルな .aspx ページ
  4. jquery ajax 呼び出しと web.config ファイルにさまざまなパラメーターを追加します。
  5. iis で異なる権限が与えられています。ネットワーク サービス、iuser、anonymous、guest など。

jQueryのクロスドメイン関連の問題だと思います。どんな助けでも大歓迎です。

ありがとう -サミット

4

2 に答える 2

1

Web リクエストの同一オリジン ポリシーに違反しているようです。

ブラウザーで、プロトコル (http/https)、サーバー、および/またはポートがリモート サービスと異なる場合、同じオリジン ポリシーに違反することになり、ブラウザーはその呼び出しが行われないようにします。

ページが関連付けられているサーバー側のコードからサービスを呼び出す (プロキシのように動作する) か、JSONP要求のようなものを調べて、サービスが JSON 形式のメソッド呼び出しとしてデータを返すようにする必要があります。

于 2012-07-25T15:31:14.607 に答える
1

jQuery を使用してクロス ドメイン WCF REST サービスを使用するには、以下のサンプルを見つけてください。

私のサービスは次のようになります。

    [ServiceContract]
    public interface IJSONPService
    {
        [OperationContract]
        [WebGet]
        string GetDate();

        [OperationContract]
        [WebInvoke]
        string PostData(string name);
    }

上記のサービスの構成エントリは次のようになります。

<services>
    <service name="Service.JSONPService">
        <endpoint address="" binding="webHttpBinding" behaviorConfiguration="json" bindingConfiguration="defaultRestJsonp" contract="Service.IJSONPService">
        </endpoint>
    </service>
</services>
<behaviors>
      <endpointBehaviors>
         <behavior name="json">
             <enableWebScript />
         </behavior>
   </behaviors>
</endpointBehaviors>
<webHttpBinding>
        <binding name="defaultRestJsonp" crossDomainScriptAccessEnabled="true">
          <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="64" maxNameTableCharCount="2147483647" />
          <security mode="None" />
        </binding>
</webHttpBinding>

crossDomainScriptAccessEnabledバインディング要素「defaultRestJsonp」の属性に注意する必要があります。これは、リクエストが JSONP 用であると判断し、クエリ文字列として来る URL からのコールバック メソッドにラップされるレスポンスを適切に変換します。

次に、ページから、上記の WCF REST サービスを呼び出す以下の JavaScript を実行します。

function TestingWCFRestWithJsonp() {
                $.ajax({
                    url: "http://domain.com/Service/JSONPService.svc/GetDate",
                    dataType: "jsonp",
                    type: "GET",
                    timeout: 10000,
                    jsonpCallback: "MyCallback",
                    success: function (data, textStatus, jqXHR) {
                        alert(data);
                    },
                    error: function (jqXHR, textStatus, errorThrown) {alert('error');

                    },
                    complete: function (jqXHR, textStatus) {alert('complete');
                    }
                });
            }
            function MyCallback(data) {
                alert(data);
            }

$.ajax メソッド呼び出しの jsonpCallback プロパティを確認してください。

Web サービス呼び出しへの生の要求は次のようになります。

GET http://localhost/Service/JSONPService.svc/GetDate?callback=MyCallback&_=1343391683779 HTTP/1.1
Host: localhost
Connection: keep-alive

また、WCF REST サービスからの生の応答は次のようになります。

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/x-javascript
Date: Fri, 27 Jul 2012 12:21:23 GMT
Content-Length: 27

MyCallback("27\/07\/2012");

注: JSONP リクエストを実行すると、$.ajax メソッドの error/complete/success は呼び出されません。

于 2012-07-27T13:23:47.617 に答える