3

私は外部のWebサービスを呼び出そうとしています。Chromeでは正常に機能しますが、FirefoxとIEでは機能しません。chromeでは戻ります'true'が、firefoxでは戻ります'0 error'。これが私の完全なコードです...

 <script type="text/javascript" src="js/jquery-1.3.1.min.js"></script>
<script type="text/javascript">

    $(document).ready(function () {
        $("#btnCall").click(function (event) {
            var campaignid = 1000007;
            var r_source_id = 1000008;
            var parameters = "{'CompanyName': '" + document.getElementById('txtCompanyName').value + "', 'name': '" + document.getElementById('txtName').value + "', 'title': '', 'email':'" + document.getElementById('txtEmail').value + "', 'phone':'" + document.getElementById('txtPhoneNo').value + "', 'web_url':'', 'no_of_emp':'0', 'c_Currency_id':'100', 'r_source_id':'" + r_source_id.toString() + "', 'industry_ID':'1', 'city':'', 'country_ID':'" + document.getElementById('ddlCountry').value + "', 'cur_solution':'','pur_timeline':'','comments':'', 'year_sell_erp':'2013', 'support':'', 'bpgroup_ID':'1', 'C_Campaign_ID':'" + campaignid.toString() + "', 'R_STATUS_ID':'1000033', 'C_Region_ID':'100', 'CreatedBy':'1000012', 'salesrep_id':'1000012', 'ad_org_id':'1000001', 'ad_client_id':'1000001', 'UpdatedBy':'100', 'AccessKey':'caff4eb4fbd6273e37e8a325e19f0991'}";
            $.ajax({
                type: "POST",
                url: "http://cloudservice.softwareonthecloud.com/service.asmx/SetLead",
                data: parameters,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                async: false,
                success: function (msg) {
                    AjaxSucceeded(msg);
                },
                error: AjaxFailed
            });
        });
    });
    function AjaxSucceeded(result) {
        alert(result.d);
    }
    function AjaxFailed(result) {
        alert(result.status + ' ' + result.statusText);
    }  
</script>

これがテスト用にこの関数のURLをアップロードしたものです

4

4 に答える 4

9

別のドメインで Web サービスを呼び出そうとすると、このエラーが発生します。これは、 Same origin ポリシーに違反しています。これはセキュリティ上の制限です。古いブラウザのほとんどは、そのようなリクエストを拒否します。

JavaScript で別のドメインの Web サービスにアクセスする場合は、Cross-Origin Resource Sharingをセットアップする必要があります 。

Cross-Origin Resource Sharing (CORS) は、Web ページが別のドメインに対して XMLHttpRequests を作成できるようにするメカニズムです。このような「クロスドメイン」リクエストは、それ以外の場合、同じオリジン セキュリティ ポリシーに従って、Web ブラウザによって禁止されます。CORS は、クロスオリジン要求を許可するかどうかを決定するためにブラウザーとサーバーが対話できる方法を定義します

Web サービス コードにアクセスできる場合は、サーバーで CORS 要求を有効にできます。
コルを有効にすることは良いリソースです。ここにcorsの説明があります

IIS 7 では、web.config にいくつかのカスタム ヘッダーを設定する必要があります。

<system.webserver>
 <httpprotocol>
  <customheaders>
   <add name="Access-Control-Allow-Origin" value="*" />
   <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customheaders>
 </httpprotocol>
</system.webserver>

IIS6の手順は次のとおりです

セキュリティに関する注意: ここの例では、サーバーへのすべてのリクエストを許可しています。機密データを提供している場合は、これを選択したドメインに制限することができます。

WCF ベースのリクエストも 経由で検査できWebOperationContext.Current.IncomingRequest、適切なヘッダーを送信できます。

CORS リクエストは、古いブラウザーではサポートされていません。ブラウザの完全な互換性リストはこちらで確認できます

古いブラウザーをサポートする必要がある場合、または Web サービスを変更できない場合は、サーバーでいつでも Web サービス プロキシをホストできます。要求をサーバーに送信すると、サーバーは元の Web サービスからのデータを要求します。クロス オリジン ポリシーに違反していないため、これは正常に機能します。シンプルな http ハンドラーは、サーバー上でプロキシとして機能できます。

以下は、REST Web サービスへの http ハンドラー プロキシのサンプルです。

public void ProcessRequest(HttpContext context) {
  WebClient myClient = new WebClient(); 

  //Fetch response on your server
  string response = myClient.DownloadString("http://example.com/webservice/webMethod");

  // Send response to your javascript.
  context.Response.Write(response);
}

その後、JavaScript から必要に応じてこのハンドラーを呼び出すことができます。

于 2013-01-15T05:57:48.067 に答える
1

あなたのリクエストは同一生成元ポリシーに違反しています。

独自のアプリケーションでサービスのプロキシサービスを作成します。受信したデータをリモートサービスに送信し、回答を中継します。

これには、AccessKeyをプライベートに保つことができるという追加の利点があります。リモートサーバーに投稿する前に、サーバー上のリクエストに追加できます。

これが非常に手間がかかる場合は、元のサービスの開発者に、それを呼び出すWebページもサーバーに追加するように依頼してください。次に、このWebページをIFrameに追加できます。

于 2013-01-20T11:36:52.887 に答える
1

JSONP または easyXDM フレームワークを使用することもできます。

JSONP の場合、$.ajax 属性を 1 つだけ変更する必要があります。設定しdataType:"jsonp"ます。その場合、サーバーは json と関数名を次の形式で返す必要があります: funcName(<JSON structure>). これは「GET」リクエストでのみ利用可能ですが、ここでは「POST」を使用しています。「GET」リクエスト呼び出しに切り替えてみてください。

それが不可能な場合は、以前に説明した javascript easyXDM フレームワークまたは CORS 設定の使用を検討する必要があります。easyXDM には、古いブラウザーで有効にする独自の cors コンポーネントがあります。

于 2013-01-18T09:33:51.223 に答える