可以将ASMX配置为响应HTTP 1.1 OPTIONS请求吗?

时间:2011-11-21 00:54:53

标签: asmx iis-7.5 httpverbs

似乎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那里得到什么,我还考虑了其​​他两个潜在的想法:

    1. 实施System.Web.IHttpHandler,将其添加到web.config handlers部分,以便仅管理默认ASMX行为之外的verbs=OPTIONS path=*.asmx次请求。这将是一个可行的解决方法。
    2. 我可以切换到使用WCF。但是我想先知道ASMX是否过于笨拙。

在我采取行动之前,我想向社区查询我可能忽略的事情,或者更好的选择(没有双关语)。

更新#1

是的,我的网络服务托管在其他域名上。显然,使用相同的原始策略导航过多的问题。对于所有考虑的问题,这个更新绝对是值得的信息!
但是,我想确保此问题保留在ASMX服务器和HTTP级别。虽然我可能在不久的将来面临相关的浏览器问题,但这些问题对于解决此问题的HTTP协议级别并不重要。谢谢。

2 个答案:

答案 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错误。