6

似乎 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 的要求是不可能的,我考虑了另外两个潜在的想法:

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

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

更新#1

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

4

2 回答 2

1

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

感谢在这个 SO 问题结束时发布它的人

于 2018-08-31T02:46:51.023 回答
-1

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

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

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

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

于 2011-11-21T03:33:00.663 回答