私はここ数週間、顧客向けに作成した jQuery プラグインから、jQuery AJAX SOAP ベースのクロスドメイン Web サービスの 1 つを動作させようとしています。私が行った調査のほとんどは、CORS または Cross Origin Resource Sharing が jasonP (GET) タイプの呼び出ししか許可しないため、それが不可能であることを示しているように見えました。
私はついにそれを機能させる方法を考え出し、私がしなければならなかったことを共有したいと思いました.
最初に理解しておくべきことは、サーバーが別のドメインにある CORS 対応のブラウザーでは、GET (他のパラメーターの中でも特に) 以外のすべてがプリフライト チェックと呼ばれるものになるということです。これが意味することは、ブラウザが実行を許可されているオプションのリストをサーバーに要求するということです。サーバーが SOAP ベースの Web サービスを許可するオプションの正確なリストを返さない限り、呼び出しは実際の要求が行われる前であっても失敗します。
必要なことは、Web サーバー (私の例では IIS7.5) が正しいオプションのリストを返すようにすることです。
これを行うには、inetpub\wwwroot フォルダーに web.config ファイルを構成します (ない場合は、作成して以下をコピーします)。
私の web.config ファイルは次のようになります。
重要なことは、すべてが期待どおりに機能していることに気づいたら、大文字と小文字が区別されることです。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS, PUT, DELETE" />
<add name="Access-Control-Allow-Headers" value="content-type,soapaction,x-requested-with" />
</customHeaders>
</httpProtocol>
<handlers accessPolicy="Read, Execute, Script" />
</system.webServer>
</configuration>
私のjQuery AJAXコードは次のようになります。
var getNextJobId = function()
{
var se = '';
se = se + '<?xml version="1.0" encoding="UTF-8" standalone="no"?>';
se = se + '<soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope">';
se = se + '<soap-env:Body>';
se = se + '<ebas:getNextJobIdRequest xmlns:ebas="http://www.ebasetech.com">';
se = se + '<ebas:ORGCODE>' + plugin.settings.orgcode + '</ebas:ORGCODE>';
se = se + '</ebas:getNextJobIdRequest>';
se = se + '</soap-env:Body>';
se = se + '</soap-env:Envelope>';
$.ajax(
{
url: params.webserviceTargetUrl,
beforeSend: function(xhr)
{
xhr.setRequestHeader("SOAPAction", "getNextJobId");
},
type: "POST",
dataType: "xml",
data: se,
crossDomain: true,
headers: {"X-Requested-With": "XMLHttpRequest"},
async: false,
success: function(xml)
{
params.jobId = $(xml).find("ebas\:JOBID").text();
},
failure: function(xml)
{
params.webserviceFailure = $(xml).text();
},
contentType: "charset=UTF-8"
});
}