似乎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.config handlers
部分,以便仅管理默认ASMX行为之外的verbs=OPTIONS
path=*.asmx
次请求。这将是一个可行的解决方法。 在我采取行动之前,我想向社区查询我可能忽略的事情,或者更好的选择(没有双关语)。
是的,我的网络服务托管在其他域名上。显然,使用相同的原始策略导航过多的问题。对于所有考虑的问题,这个更新绝对是值得的信息!
但是,我想确保此问题保留在ASMX服务器和HTTP级别。虽然我可能在不久的将来面临相关的浏览器问题,但这些问题对于解决此问题的HTTP协议级别并不重要。谢谢。
答案 0 :(得分:0)
看起来它可能不适用,因为我在问题中没有看到它,但是我的答案是,在Web配置中,我必须删除对<remove name="OPTIONSVerbHandler" />
对在this SO question末尾发布它的人表示敬意。
答案 1 :(得分:-1)
我不知道ASMX能够处理OPTIONS,即使对于AJAX请求也是如此。在OPTIONS动词的情况下,您想要返回什么?客户打算使用OPTIONS打算做什么?
另外,我从ASP.NET处理OPTIONS动词的角度研究了这个问题。就我而言,它在根web.config级别被禁止,而不是在ASP.NET或ASMX级别。该动词的默认映射是
<add path="*" verb="*" type="System.Web.HttpMethodNotAllowedHandler" validate="True" />
这对应于您收到的405错误。