似乎 ASMX 隐含地不允许使用 OPTIONS 动词。我发布这个问题是因为我使用带有 POST 的 jQuery AJAX 调用,它首先在发出 POST 动词**之前向服务器查询可用的选项。
默认情况下,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"
});
**注意:我不想将客户端切换为使用 GET 而不是 POST。
摘要问题:
我可以将 ASP.NET 配置为允许 ASMX 本身无错误地处理 OPTIONS 请求吗?
我考虑过的其他想法
我可以寻找一种方法来告诉
jQuery.ajax(..)
不要在 POST 之前发出 OPTIONS 动词?如果我对传统 ASMX 的要求是不可能的,我考虑了另外两个潜在的想法:
- 实现 a
System.Web.IHttpHandler
,将其粘贴在 web.confighandlers
部分以仅管理对默认 ASMX 行为之外的verbs=OPTIONS
请求。path=*.asmx
这将是一个可行的解决方法。 - 我可以切换到使用 WCF。但是我想先知道 ASMX 是否太笨拙。
- 实现 a
在我采取行动之前,我想向社区查询我可能忽略的事情,或者更好的选择(没有双关语)。
更新#1
是的,我的网络服务托管在不同的域上。显然,使用相同的原始策略导航有很多问题。这次更新绝对是值得考虑的问题的上下文信息!
但是我想确保这个问题停留在 ASMX 服务器和 HTTP 级别。尽管我在不久的将来可能会遇到相关的浏览器问题,但这些对于解决这个问题的 HTTP 协议级别并不重要。谢谢。