ここや他のさまざまなWebサイトのさまざまな投稿をすべて読むのに多くの時間を費やしましたが、次のコードがあります。
function post_cors(vars) {
// cross domain AJAX posting - needs work to function in IE
var successFunction = vars.success;
var errorFunction = vars.error;
var url = vars.url;
var data = vars.data;
if ($.browser.msie && window.XDomainRequest) {
// CROSS DOMAIN AJAX FOR < IE10 (Doesn't work yet!)
var xdr = new XDomainRequest();
xdr.open("POST", url);
xdr.send(JSON.stringify(data));
xdr.onload = function () {
// XDomainRequest doesn't provide responseXml, so if you need it:
alert('Response: ' + xdr.responseText);
};
} else {
$.ajax({ // proper AJAX for sensible browsers
cache: false,
dataType: "json",
url: url,
crossDomain: true,
data: data,
type: "POST",
contentType: "application/json; charset=utf-8",
success: function (data, textStatus, request) {
successFunction(data, textStatus, request);
},
error: function (data, textStatus, request) {
errorFunction(data, textStatus, request);
}
});
};
};
関数は次のように呼び出されます。
post_cors({
'success': function (data) {
doStuffWithResponse()
},
'url': SOME WEB SERVICE,
'data': "{ 'para1': '" + para1 + "', 'para2': '" + para2+ "' }"
});
これは、標準のクロス ドメイン AJAX 投稿を Chrome や Safari などの成熟したブラウザーに投稿し、iPad などを含めて完全に機能します。ただし、IE < 10 では機能しません。
関連するコードは次のとおりです。
var xdr = new XDomainRequest();
xdr.open("POST", url);
xdr.send(JSON.stringify(data));
SO などのさまざまなスレッドは、これが機能する必要があることを示唆しています。たとえば 、POST メソッドを使用して XDR で JSON データを送信する方法
しかし、そうではなく、理由がわかりませんが、POST とデータに関係していると思われます。
だから私はさまざまな実験を試みました。
パラメータなしの Web メソッドへの投稿。
<WebMethod()> _
Public Function HelloWorld() As String
Return "Hello World"
End Function
これは、ローカル サーバーで実行すると機能するように見えますが、Web ホスト サーバーに追加すると機能しません。成功コードを受け取りました200
が、IE コンソールまたは Fiddler で実際に応答を確認できないようです。「オフライン」で動作するように見えるという事実は、とにかくニシンかもしれません...?
パラメータを取るメソッドへの投稿
<WebMethod()> _
Public Function TryThis(term as string) As String
Return term
End Function
これは IE では常にエラーを返しますが、http 500
成熟したブラウザーでは完全に機能します。
Fiddle でも IE コンソールでもエラー情報が表示されません。
後者は、これをリクエストヘッダーとして示しています。
Key Value
Request POST http://samtest.thinkka.com/api/Sam_ScriptService.asmx/HelloWorld HTTP/1.1
Accept */*
Origin http://localhost:63238
Accept-Language en-GB
Accept-Encoding gzip, deflate
User-Agent Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Host samtest.thinkka.com
Content-Length 108
Proxy-Connection Keep-Alive
Pragma no-cache
および応答ヘッダー:
Key Value
Response HTTP/1.1 500 Internal Server Error
Cache-Control private
Content-Type text/html; charset=utf-8
Server Microsoft-IIS/7.5
X-AspNet-Version 4.0.30319
X-Powered-By ASP.NET
Access-Control-Allow-Origin *
Access-Control-Allow-Methods GET, POST
Access-Control-Allow-Headers Content-Type
Date Tue, 08 Oct 2013 10:24:29 GMT
Content-Length 4826
Response Body
が空です。エラー メッセージを読み取ることができないため、このエラーが発生する場所や理由がわかりません。
問題は POST またはフォーム データにあると思いますか?
データを JSON.Stringified ではなくオブジェクトとして投稿しようとしましたが、うまくいきません。
そのすべての Fiddler は、IE コンソールではできないことを教えてくれるようです。
No Proxy-Authorization Header is present.
No Authorization Header is present.
どちらも [Auth] タブに表示されますが、Chrome を使用している場合は Fiddler にも表示され、肯定的な応答が返されます。
Chrome がデータを 2 回投稿していることに気付きました。すべての読書の過程で、これが正しいことを知っています (現時点では理由を思い出せません)。IE はそうではありません。最初の投稿だけを行っているだけです。これはAJAXの機能なので正しいと思いますか?
私の Web.Config ファイルは適切なヘッダーを追加します:
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
明らかに、私はここでクロスドメインの問題を認識しており、見つけることができるすべての例に従いましたが、今は立ち往生しています...したがって、ここに投稿します.
ASMX Web サービスを使用しないように、またはクロス ドメイン投稿が許可されていないなどとは言わないでください。今すぐ解決策が必要です。:-)
上記のリンクの元の質問の作成者は、サーバー側の応答でエラーを見つけて問題を解決したことを示唆していますが、私のものは古いバージョンの IE を除くすべてで完全に機能しています (ちなみに IE10 で機能します)。サーバー側のエラーであることを確認できません。エラーの場合は、サーバーに関する情報が得られないError 500
ため、識別できません。