【问题标题】:Can ASMX be configured to respond to an HTTP 1.1 OPTIONS request?可以将 ASMX 配置为响应 HTTP 1.1 OPTIONS 请求吗?
【发布时间】: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 的要求是不可能的,我考虑了另外两个潜在的想法:

    1. 实现System.Web.IHttpHandler,将其粘贴在web.config handlers 部分中,以便在默认ASMX 行为之外仅管理对path=*.asmxverbs=OPTIONS 请求。这将是一个可行的解决方法。
    2. 我可以切换到使用 WCF。但是我想先知道 ASMX 是否太笨拙。

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

更新 #1

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

【问题讨论】:

  • 显然,同源策略需要发出 OPTIONS 标头,这与此问题的标题stackoverflow.com/questions/1099787/… 中描述的不同,所以我将摆脱 OPTIONS 调用的想法放在后面现在燃烧器。
  • 你设法让它与HTTP OPTIONS一起工作吗?我正在尝试使用 HTTP HEAD 访问 .asmx 以了解 asmx 是死是活并得到相同的错误。
  • @murali 我没有 OPTIONS 在这种情况下工作

标签: asmx iis-7.5 httpverbs


【解决方案1】:

看起来它可能不适用,因为我在问题中没有看到它,但我对此的回答是,在网络配置中,我必须删除对 &lt;remove name="OPTIONSVerbHandler" /&gt; 的指令

感谢在this SO question 末尾附近发布它的人

【讨论】:

    【解决方案2】:

    我不知道 ASMX 曾经能够处理 OPTIONS,即使对于 AJAX 请求也是如此。在 OPTIONS 动词的情况下,您到底想返回什么?客户使用 OPTIONS 的目的是什么?

    另外,我从 ASP.NET 处理 OPTIONS 动词的角度对此进行了研究。就我而言,它在根 web.config 级别被禁止,而不是在 ASP.NET 或 ASMX 级别。该动词的默认映射是

    <add path="*" verb="*" type="System.Web.HttpMethodNotAllowedHandler" validate="True" />
    

    这对应于您收到的 405 错误。

    【讨论】:

    • 我正在处理 OPTIONS 因为同源策略与此问题stackoverflow.com/questions/1099787/… 中描述的不同我需要。我的根配置没有那个映射但是你告诉我我可能会考虑我还没有完成的继承配置。
    • 我确实尝试过制作一个自定义处理程序(来自问题底部的我的想法部分)&lt;add name="optionsHandler" path="*.asmx" verb="OPTIONS" preCondition="integratedMode" type="Com.Example.MarkupTransformation.WebService.HttpOptionsHandler" /&gt; 并消除 405 消息并返回响应。
    • 确实,通过这个过程,我意识到我已经习惯于处理来自同一个域的 Web 服务调用。我对缓解同源政策的尝试让我意识到我已经避开了一些有趣的场景。
    • 如果您需要做任何有趣的事情,那么我建议您立即停止使用 ASMX。它的灵活性很小,并且不再得到增强,也没有修复错误。
    • 您也许可以,但请记住,ASMX 几乎没有可扩展性。如果你需要做任何不寻常的事情,那你就倒霉了。
    猜你喜欢
    • 2011-01-16
    • 2020-09-18
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多