web-dev-qa-db-ja.com

WebサービスへのjQuery呼び出しが「トランスポートなし」エラーを返す

次のWebサービスがあります。

    [WebMethod]
    public string HelloWorld()
    {
        return "Hello World";
    }

これは、標準のクラスデコレータを変更しない標準です。

このjQueryメソッドがあります。

var webMethod = "http://localhost:54473/Service1.asmx/HelloWorld"; 

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    data: "{}",  
    dataType: "json",
    url: webMethod,
    success: function(msg){ alert(msg.d); },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        alert(errorThrown);
          }
});

後からデータを投稿する必要があるため、これは投稿アクションです。

JQueryを実行すると、「トランスポートなし」エラーが返されます。

私が言及しなければならないことの1つは、jQueryが私のマシンの単純なHTMLファイルに格納され、WebServiceが私のマシンでも実行されていることです。

HTMLページにはコードビハインドはありません。これは単なるWebページであり、c#プロジェクトなどではありません。

誰かが私をここで正しい方向に向けることができますか?

163
griegs

JQueryページがhttp://localhost:54473からロードされていない場合、この問題はおそらく、クロスドメインリクエストを行おうとしているためです。

Update 1このブログ投稿 をご覧ください。

Update 2これが本当に問題である場合(そして、私はそれが疑われる)、あなたはJSONPを解決策としてチェックアウトしたいかもしれません。開始に役立つリンクをいくつか紹介します。

95

これを追加:jQuery.support.cors = true;

JQueryでのクロスサイトスクリプティングを可能にします(1.4x以降に導入されたと思います)。

本当に古いバージョンのjQuery(1.3.2)を使用し、16.1に交換しました。 .ajax()呼び出しを除くすべてが機能していました。上記の行を追加すると、問題が修正されました。

252
SrBlanco

ページで同じエラーが発生したため、次の行を追加しました。

<!--[if lte IE 9]>
<script type='text/javascript' src='//cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js'></script>
<![endif]-->

そして、それは最終的に私のために動作します;)IE9でこれ以上のエラー。

26
bsuttor

提案された答えはどれも私にとって完全に機能しませんでした。私のユースケースは少し異なります(IE9でS3 .jsonファイルにajaxを取得する)。 jQuery.support.cors = true;を設定するとNo Transportエラーがなくなりましたが、それでもPermission deniedエラーが発生していました。

私にとってうまくいったのは、 jQuery-ajaxTransport-XDomainRequest を使用してIE9にXDomainRequestを強制的に使用させることでした。これを使用するのにjQuery.support.cors = true;を設定する必要はありませんでした

7
rynop

dataType = 'json'の場所でdataType = 'jsonp'を使用して解決します

6
Abhishek

私にとっては、まったく別の話です。
このページには優れた検索エンジンのランキングがあるため、ここにもケースと解決策を追加する必要があります。

jqueryを使用して自分でwebpackを構築し、使用するモジュールのみを選択しました。 Ajaxは常に失敗し、「トランスポートなし」メッセージが唯一の手がかりになります。

長いデバッグの後、問題はXMLHttpRequestjqueryにプラグイン可能であり、デフォルトでは含まれないことが判明しました。

ブラウザでajaxを機能させるには、jquery/src/ajax/xhrファイルを明示的に含める必要があります。

0
Curious Sam

私もこの問題を抱えており、上記のすべてのソリューションは失敗したか、クライアントWebサービスの制限のために適用できませんでした。

このために、クライアントのサーバーにあるiframeをページに追加しました。そのため、データをiframeに投稿し、iframeがそれをWebサービスに投稿します。したがって、クロスドメイン参照は排除されます。

Iframeとの間で許可されたページ投稿データのみを確認するために、双方向のOriginチェックを追加しました。

それが役に立てば幸い

<iframe style="display:none;" id='receiver' name="receiver" src="https://iframe-address-at-client-server">
 </iframe>

//send data to iframe
var hiddenFrame = document.getElementById('receiver').contentWindow;
hiddenFrame.postMessage(JSON.stringify(message), 'https://client-server-url');

//The iframe receives the data using the code:
window.onload = function () {
    var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
    var eventer = window[eventMethod];
    var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
    eventer(messageEvent, function (e) {
        var Origin = e.Origin;
        //if Origin not in pre-defined list, break and return
        var messageFromParent = JSON.parse(e.data);
        var json = messageFromParent.data;

        //send json to web service using AJAX   
        //return the response back to source
        e.source.postMessage(JSON.stringify(aJAXResponse), e.Origin);
    }, false);
}
0
Riju Mahna