jQuery Call to WebServiceが「No Transport」エラーを返す


163

次の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を実行すると、「No transport」エラーが返されます。

また、jQueryはマシン上の単純なHTMLファイルに格納され、WebServiceもマシン上で実行されていることにも言及する必要があります。

HTMLページの背後にコードはなく、それは単なるWebページであり、c#プロジェクトなどではありません。

誰かが私をここで正しい方向に向けてくれますか?


ブラウザーを使用するだけでWebサービスにアクセスできますか?
Avitus

申し訳ありませんが、これが別の投稿であることに気付きませんでした(私はこの投稿を編集しましたが、自分の投稿だと思っていました)、自分の投稿でこの投稿へのハイパーリンクをクリックしている必要があります。投稿の所有者に本当に申し訳ありません= \
Erick Garcia

$ .support.cors = true; エンドポイントでCORSが有効になっている(Access-Control-Allow-Originヘッダーなどで正しく応答する)場合、このコード行は、jQueryにIE8でクロスオリジンリクエストを実行するように指示します。少し前にこれに遭遇しました。時間と頭痛の一部が解消されることを願っています。
Jeremy Hert、2014年

回答:


95

jQueryページが読み込まれていない場合、http://localhost:54473この問題はおそらく、クロスドメインリクエストを実行しようとしていることが原因です。

Update 1では、 見てくださいこのブログの記事を

Update 2 これが本当に問題である(そして私が問題だと思う)場合は、ソリューションとしてJSONPをチェックすることをお勧めします。開始に役立つ可能性のあるいくつかのリンクを以下に示します。


4
ええ、それはおそらくセキュリティに関係しています。
thenengah

3
localhost:54473である必要はありません。同じドメインである必要があります。
jcolebrand 2011年

7
@drachensternうーん、スキーム、ホストポートは同じである必要があるといつも思っていました(常に読んでいることを覚えているようです)。これこれこれは、同じドメインを構成するものについての私の考え方をサポートしているようです。
no.good.at.coding

@drachenstern助けてくれてうれしい!このすべてのウェブのものはトリッキーです-毎日新しいことを学ぶものです:)
no.good.at.coding

1
@griegs聞いても問題ありませんが、実際には問題を解決していないことに注意してください。jQueryが導入した安全策を削除するだけなので、環境がクロスドメインリクエストを許可している場合にのみ機能します。ブラウザで許可されていない場合、このプロパティを設定しても何も起こりません。JSONPを導入するために今少し努力することをお勧めします。少なくとも、jQueryのクロスドメインサポートを強制することが、サポートする予定のすべてのブラウザーで機能するかどうかを確認してみてください。また、後で発生する可能性のある他の問題についてはコメントできません。
no.good.at.coding

253

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

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

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


Aは、ここでの詳細情報をビット:blueonionsoftware.com/...
アンドリュー・アーノット

14
これは私の問題を解決し、ChromeとFirefoxで動作しましたが、IEでは動作しませんでした。これを私のスクリプトの先頭に追加し、すべてが良かった
Peter

@SrBlancoこれも私の問題を修正しました。この情報を共有していただきありがとうございます。
devの

4
非常に良い修正、相対パスを使用して同じドメインからkmlファイルを要求したときにInternet Explorer 9で同じ問題が発生しました... IEの謎...
Matteo Conta

ありがとう。はい、1.5のjqueryの更新後、残りの呼び出しが停止しました。このコードはそれを修正しました。
ashraf

26

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

<!--[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でこれ以上エラーはありません。


6
Githubプロジェクト:github.com/MoonScript/jQuery-ajaxTransport-XDomainRequestおよびXDomainRequest情報:blogs.msdn.com/b/ieinternals/archive/2010/05/13/…。基本的に、IE8とIE9はXMLHttpRequestオブジェクトのCORSをサポートしていません。代わりにXDomainRequestオブジェクトを使用する必要があります(これはより制限されています。2番目のリンクの情報を読み取ることができます)。
リチャーダデー2014年

7

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

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


6

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


2
ちなみに、jsonpはPOST動詞をサポートしておらず、GETのみをサポートしているため、元の投稿者のリクエストには実際には機能しません。
Daniel Cox

そうそう、私はそれをajaxを使用してfbwallやgoogle +などのフィードを取得するために使用した
Abhishek

おかげで私の+1になりました。
Manatherin 2013年

0

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

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

許可されたページの投稿データのみがiframeとの間でやり取りされることを確認するために、双方向の原点チェックを追加しました。

それが役に立てば幸い

<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

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

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

長いデバッグの後、問題XMLHttpRequestはプラグイン可能でjqueryあり、デフォルトでは含まれていません。

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


-1

リクエストURLからドメインを削除するだけで解決しました。

Before: https://some.domain.com/_vti_bin/service.svc

After: /_vti_bin/service.svc

1
はい、ドメインがURLで指定されていないjQuery同一ドメインAjaxリクエスト。私の場合、クロスサイトリクエストを行う必要はなく、ajaxリクエストのurlパラメータにドメインがあると、リクエストがクロスサイトのように動作するように見えました。私の環境では、いくつかのリダイレクトルールでMicrosoft ForeFrontを使用しており、問題が発生している可能性があります。
Draghon

では、なぜクロスドメインのajaxリクエストについて質問に答えているのですか
Naeem Shaikh 14

1
@ NaeemShaikh27、リクエストの性質(クロスドメインvs同一ドメイン)はOPから明確ではありませんでした。私は質問の「明白な」パラメータを与えられた質問に対処していました。とにかく、私は「ねえ、私は同じエラーが出た、ここで私がやったことです」と言っているだけで、あなたがそれを好きかどうか(またはそれがSOに適切かどうか)、それは私にとってうまくいきました。さて、あなたが戻って質問をより具体的にすると、私の応答は完全に無関係になります。
Draghon 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.