【发布时间】:2018-08-31 10:46:51
【问题描述】:
似乎 ASMX 隐含地不允许使用 OPTIONS 动词。我发布这个问题是因为我使用带有 POST 的 jQuery AJAX 调用,它首先在发出 POST 动词**之前向服务器查询可用的 OPTIONS。
默认情况下,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 blog post 对使用 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 的要求是不可能的,我考虑了另外两个潜在的想法:
- 实现
System.Web.IHttpHandler,将其粘贴在web.confighandlers部分中,以便在默认ASMX 行为之外仅管理对path=*.asmx的verbs=OPTIONS请求。这将是一个可行的解决方法。 - 我可以切换到使用 WCF。但是我想先知道 ASMX 是否太笨拙。
- 实现
在我采取行动之前,我想向社区询问我可能忽略的事情,或者更好的选择(没有双关语)。
更新 #1
是的,我的网络服务托管在不同的域上。显然,使用相同的原始策略导航有很多问题。此更新绝对是值得考虑的所有问题的上下文信息!
但是我想确保这个问题停留在 ASMX 服务器和 HTTP 级别。尽管我在不久的将来可能会遇到相关的浏览器问题,但这些对于解决这个问题的 HTTP 协议级别并不重要。谢谢。
【问题讨论】:
-
显然,同源策略需要发出 OPTIONS 标头,这与此问题的标题stackoverflow.com/questions/1099787/… 中描述的不同,所以我将摆脱 OPTIONS 调用的想法放在后面现在燃烧器。
-
你设法让它与
HTTP OPTIONS一起工作吗?我正在尝试使用HTTP HEAD访问 .asmx 以了解 asmx 是死是活并得到相同的错误。 -
@murali 我没有 OPTIONS 在这种情况下工作