次の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#プロジェクトなどではありません。
誰かが私をここで正しい方向に向けることができますか?
JQueryページがhttp://localhost:54473
からロードされていない場合、この問題はおそらく、クロスドメインリクエストを行おうとしているためです。
Update 1このブログ投稿 をご覧ください。
Update 2これが本当に問題である場合(そして、私はそれが疑われる)、あなたはJSONPを解決策としてチェックアウトしたいかもしれません。開始に役立つリンクをいくつか紹介します。
これを追加:jQuery.support.cors = true;
JQueryでのクロスサイトスクリプティングを可能にします(1.4x以降に導入されたと思います)。
本当に古いバージョンのjQuery(1.3.2)を使用し、16.1に交換しました。 .ajax()呼び出しを除くすべてが機能していました。上記の行を追加すると、問題が修正されました。
ページで同じエラーが発生したため、次の行を追加しました。
<!--[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でこれ以上のエラー。
提案された答えはどれも私にとって完全に機能しませんでした。私のユースケースは少し異なります(IE9でS3 .jsonファイルにajaxを取得する)。 jQuery.support.cors = true;
を設定するとNo Transport
エラーがなくなりましたが、それでもPermission denied
エラーが発生していました。
私にとってうまくいったのは、 jQuery-ajaxTransport-XDomainRequest を使用してIE9にXDomainRequestを強制的に使用させることでした。これを使用するのにjQuery.support.cors = true;
を設定する必要はありませんでした
dataType = 'json'の場所でdataType = 'jsonp'を使用して解決します
私にとっては、まったく別の話です。
このページには優れた検索エンジンのランキングがあるため、ここにもケースと解決策を追加する必要があります。
jquery
を使用して自分でwebpack
を構築し、使用するモジュールのみを選択しました。 Ajaxは常に失敗し、「トランスポートなし」メッセージが唯一の手がかりになります。
長いデバッグの後、問題はXMLHttpRequest
がjquery
にプラグイン可能であり、デフォルトでは含まれないことが判明しました。
ブラウザでajaxを機能させるには、jquery/src/ajax/xhr
ファイルを明示的に含める必要があります。
私もこの問題を抱えており、上記のすべてのソリューションは失敗したか、クライアント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);
}