2

ここや他のさまざまな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ため、識別できません。

4

2 に答える 2

2

まず、CORS-for-XmlHttpRequest オブジェクトと従来の XDomainRequest オブジェクトの両方をサポートする IE10 内で XDomainRequest を使用しないように、コードを修正する必要があります。

Content-Type: application/json次に、リクエストにヘッダーがない場合に HTTP/500 レスポンスを返さないように、サーバー側のコードを更新する必要があります。XDomainRequestではそのヘッダーを設定できません。サーバーは、リクエスト本文の解析方法を決定するときにそれを期待しているようです。

于 2013-10-08T16:51:24.170 に答える
1

これは少し古いかもしれませんが、IE8 は実際に POST データをバイナリ ストリーム (または単なるプレーン テキスト) で送信することがわかりました。これを見つけたとき、フォーム POST をデコードしようとして問題が発生していました。このコンテンツを取得するための ASP.NET C# での簡単なワンライナーは次のとおりです。

string strContent = new System.Text.ASCIIEncoding().GetString(Context.Request.BinaryRead((int)Context.Request.InputStream.Length));

これを心ゆくまで展開してください。

于 2014-02-13T11:25:07.447 に答える