ASMX は暗黙的に OPTIONS 動詞を許可していないようです。POST動詞**が発行される前に、利用可能なOPTIONSをサーバーに最初に照会するPOSTでjQuery AJAX呼び出しを使用しているため、この質問を投稿しています。
既定では、Web.config はすべての動詞をレガシ ASMX にマップするため、この部分的な構成サンプルに示すように、すべてが適切にルーティングされる必要があります。
<system.webServer>
<requestFiltering>
<verbs>
<add verb="OPTIONS" allowed="true"/>
<add verb="GET" allowed="true"/>
<add verb="POST" allowed="true"/>
</verbs>
</requestFiltering>
<handlers>
<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
ただし、OPTIONS 要求の HTTP 応答は常に 405 です。たとえば、次の要求が与えられます。
OPTIONS http://localhost:35920/MarkupTransfomer.asmx HTTP/1.1
Host: localhost:35920
Access-Control-Request-Method: POST
常に次のようになります。
HTTP/1.1 405 Method Not Allowed
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
jQuery AJAX 呼び出しは次のようになります。これは、かなり最近のEncosia ブログ投稿からの ASMX の操作に関する推奨事項です。
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "http://localhost:35920/MarkupTransfomer.asmx",
data: "{'hi'}",
dataType: "json"
});
**注: POST の代わりに GET を使用するようにクライアントを切り替えたくありません。
まとめの質問:
ASP.NET を構成して、ASMX が本質的にエラーなしで OPTIONS 要求を処理できるようにすることはできますか?
私が検討した他のアイデア
jQuery.ajax(..)POST の前に OPTIONS 動詞を発行しないように指示する方法を探すことができますか?従来の ASMX に求めていることが不可能な場合は、他に 2 つの考えられるアイデアを検討しました。
- を実装し
System.Web.IHttpHandler、web.confighandlersセクションに貼り付けて、デフォルトの ASMX 動作の外側へのverbs=OPTIONS要求のみを管理します。path=*.asmxこれは実行可能な回避策です。 - WCF の使用に切り替えることができます。ただし、最初に ASMX があまりにも扱いにくいかどうかを知りたいです。
- を実装し
行動を起こす前に、私が見落としている可能性のあるもの、またはより良いオプション (しゃれなし) についてコミュニティに問い合わせたいと思います。
更新 #1
はい、私の Web サービスは別のドメインでホストされています。どうやら同じ元のポリシーでナビゲートする問題がたくさんあります。この更新は、すべてのことを考慮した質問のコンテキストに間違いなく価値のある情報です!
ただし、この質問が ASMX サーバーと HTTP レベルにとどまるようにしたいと思います。近い将来、関連するブラウザーの問題に直面する可能性がありますが、それらはこの質問の HTTP プロトコル レベルを解決する上で重要ではありません。ありがとう。