1

どういうわけか理解できません、状況は次のとおりです。

同じマシン上にない Web サービスでメソッドを呼び出しており、スクリプトで次の JS スニペットを使用しています。

$.ajax({
            type: "POST",
            url: "http://" + gServer + "/xawebservice/xawebservice.asmx/" + webMethod,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            cache: false,
            async: false,
            data: WSParameters,
            success: function callFunction(result) { processResults(result, pType, pParam1); },
            error: function (xhr, status, error) {
                alert(error.toString());
                //alert(xhr.toString());                    
        }
        });

パラメータは問題なくテストされており、Web メソッドも正しいです。

エラーメッセージとして、私はこれを受け取ります:

  • Firefox: [例外... "失敗" nsresult: "0x80004005 (NS_ERROR_FAILURE)" 場所: "JS フレーム :: http:// localhost:7515/jquery-1.8.3.js :: :: 行 8434" データ: いいえ]
  • Chrome: エラー: NETWORK_ERR: XMLHttpRequest 例外 101
  • IE8: トランスポートなし

同じマシンで実行されている Web サービスで同じスニペットを使用している場合、問題はありません。また、Web インターフェイスを介してリモート Web サービスを使用すると、正常に動作します。

PS: 少しググったところ、いくつかのページでクロス ドメイン パラメータが推奨されていましたが、これも機能しませんでした。残念ながら、相対パスを使用してもうまくいきません。

事前にご協力いただきありがとうございます。

Br vm370

更新: 既存のコードに基づいて CORS リクエストを実行するようにコードを更新しましたが、エラー 500 が発生し、サーバーでリクエストを直接実行すると正常に動作し、サーバーで CORS がアクティブになります。

function xenappRequest(pType, pParam1) {

// CORS request    
var url = "http://" + gServer + "/webservice/webservice.asmx/webMethod";
var params = { "appName": pParam1 };
var xhr = createCORSRequest("POST", url);
if (!xhr) {
    alert('CORS not supported');
} else {
    // Do the request
    // Response handlers.
    xhr.onload = function () {
        //var text = xhr.responseText;
        alert('Response from CORS request to ' + url + ': ' + xhr.response);
    };
    xhr.onerror = function () {
        alert('Woops, there was an error making the request.');
    };
    xhr.send(JSON.stringify(params));
}

}

function createCORSRequest(method, url) {
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {
    // Check if the XMLHttpRequest object has a "withCredentials" property.
    // "withCredentials" only exists on XMLHTTPRequest2 objects.
    xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined") {
    // Otherwise, check if XDomainRequest.
    // XDomainRequest only exists in IE, and is IE's way of making CORS requests.
    xhr = new XDomainRequest();
    xhr.open(method, url);
} else {
    // Otherwise, CORS is not supported by the browser.
    xhr = null;
}
return xhr;

}

FF からエラー 500 が発生します。IE8 では、リクエストは xhr.onerror 句に含まれます...

4

2 に答える 2

4

ここでは、 Same Origin ポリシーが有効です。別のドメインと通信することはできません。プライバシーを保護するためのもので、一部の Web ページはメールや銀行口座などと通信できません。

他のドメインがCORSをサポートしている場合、ブラウザがサポートしている限り、そのタイプのリクエストを行うことができます。CORS がサポートされていない場合は、ローカル プロキシまたは JSONP リクエストを使用する必要があります [サーバーは JSONP もサポートする必要があります]。

于 2012-12-11T17:26:07.827 に答える
0

I did my bit of hair pulling over this and here is something that works for me..

// js/jquery /////////

// post method call 
function  myajaxcall_post(){     
    $.ajax({ 
            url: 'http://' + url_path_on_remote_server,
            cache: false,
            type : "POST",            
            data: {request_param1: 'something1', request_param2: 'something2' },
            dataType: 'json',
            success: function(response)
            {
                console.log(response); 
            }            
      });
}

// get method call
function  myajaxcall_get(){     
$.ajax({ 
        url: 'http://' + url_path_on_remote_server + '?callback=?',
        cache: false,            
        type : "GET",            
        data: {request_param1: 'something1', request_param2: 'something2'},
        dataType: 'json',
        success: function(response)
        {
            console.log(response);    
        }
  });
}

Note the additional '?callback=?' query string argument in the url for the get method call.

Now on the server side script there are some permission settings to do for remote ajax calls. I am not sure how secure these settings are.

The response for get method calls are prepared a little differently. It needs your json response wrapped in the callback function name that is passed to the server. Jquery automatically puts a value there in the query string '?callback=somethingfromjquery'. So we use $_GET['callback'] to get the name of that callback function.

<?php  
// server side php script ////////////////

// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
}

// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])){
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
    }         

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])){
        header("Access-Control-Allow-Headers:        {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
    }
}

// Send some response //////////////
//print_r($_POST);
//print_r($_GET);

$response = array();
$response['message'] = 'Response from '.$_SERVER['HTTP_HOST'];

if(isset($_POST)){ 
    echo json_encode($response);
}
elseif(isset($_GET)){
   echo $_GET['callback'].'('.json_encode($response).')';
}    

?>

If you need to upload files from forms you cannot do it with ajax get method calls because form serialize doesn't include files. You could use a ajax post method call with what the FormData() provides.

// js/jquery - for forms with file uploading 

function myajaxcall_submitform(){

     // put your form id 
    fdata = new FormData( document.getElementById('form1') ); 

    // add additional fields to form if any to post with
    fdata.append('upload_file_flag', 1);    

    $.ajax({ 
        url: 'http://' + url_path_on_remote_server,
        cache: false,
        type: "POST",            
        data: fdata,
        processData: false, // need this for FormData 
        contentType: false, // need this for FormData 
        dataType: 'json',
        success: function(response)
        {
                console.log(response);  
        }             
     });    
  }
于 2014-02-22T13:37:00.823 に答える