当前位置: 首页 > 面试题库 >

如何在ASP.NET MVC / WebAPI应用程序中支持HTTP OPTIONS动词

栾烨华
2023-03-14
问题内容

我已经从MVC 4 / Web API模板开始设置了ASP.NET Web应用程序。似乎一切运行正常-
我没有发现任何问题。我已经使用Chrome和Firefox浏览了该网站。我已经使用Fiddler进行了测试,所有的响应似乎都可以赚钱。

因此,现在我继续编写一个简单的Test.aspx来使用此新的Web API。脚本的相关部分:

<script type="text/javascript">
    $(function () {

        $.ajax({
            url: "http://mywebapidomain.com/api/user",
            type: "GET",
            contentType: "json",
            success: function (data) {

                $.each(data, function (index, item) {

                    ....

                    });
                }
                );

            },
            failure: function (result) {
                alert(result.d);
            },

            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert("An error occurred, please try again. " + textStatus);
            }

        });

    });
</script>

这将生成一个REQUEST标头:

OPTIONS http://host.mywebapidomain.com/api/user HTTP/1.1
Host: host.mywebapidomain.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://mywebapidomain.com
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type
Connection: keep-alive

Web API照原样返回405方法不允许。

HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/xml; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Sep 2013 13:28:12 GMT
Content-Length: 96

<Error><Message>The requested resource does not support http method 'OPTIONS'.</Message></Error>

我了解默认情况下,OPTIONS动词未在Web API控制器中连接起来…因此,我将以下代码放在UserController.cs中:

// OPTIONS http-verb handler
public HttpResponseMessage OptionsUser()
{
    var response = new HttpResponseMessage();
    response.StatusCode = HttpStatusCode.OK;
    return response;
}

…并消除了405方法不允许错误,但响应完全为空-不返回任何数据:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Sep 2013 12:56:21 GMT
Content-Length: 0

必须有其他逻辑…我不知道如何正确编码Options方法,或者控制器是否适合放置代码。(对我来说)很奇怪,当从Firefox或Chrome浏览器查看Web
API站点时,它可以正确响应,但是上面的.ajax调用出错了。如何处理.ajax代码中的“预检”检查?也许我应该在客户端的.ajax逻辑上解决此问题?或者,如果由于不处理OPTIONS动词而在服务器端出现问题。

有人可以帮忙吗?这一定是一个非常普遍的问题,如果在这里得到回答,我深表歉意。我进行了搜索,但没有找到有帮助的答案。

UPDATE 恕我直言,这是一个客户端的问题,并与阿贾克斯jQuery代码上面做。我说这是因为,当我从Web浏览器访问mywebapidomain
/ api / user时,Fiddler不会显示任何405错误标头。我可以复制此问题的唯一地方是来自JQuery
.ajax()调用。另外,在服务器(相同域)上运行时,上面相同的Ajax调用也可以正常工作。

我发现了另一篇文章:原型AJAX请求是作为OPTIONS而不是GET发送的;导致出现似乎与[01错误有关的错误,但我修改了他们的建议,但没有成功。显然,JQuery进行了编码,因此,如果Ajax请求是跨域的(属于我的),它将添加几个标头,它们以某种方式触发OPTIONS标头。

'X-Requested-With': 'XMLHttpRequest',
'X-Prototype-Version': Prototype.Version,

似乎应该有比在JQuery中修改核心代码更好的解决方案…

下面提供的答案假定这是服务器端问题。我想也许是,但是我倾向于客户,致电托管服务提供商也无济于事。


问题答案:

正如Daniel A.
White在他的评论中所说,OPTIONS请求很可能是由客户端创建的,作为跨域JavaScript请求的一部分。这是由跨源资源共享(CORS)兼容的浏览器自动完成的。该请求是初步请求或
飞行前 请求,在实际AJAX请求之前进行,以确定CORS支持哪些请求动词和标头。服务器可以选择不支持,不支持全部或某些HTTP动词。

为了完成图片,AJAX请求具有一个附加的“
Origin”标头,该标头标识了从何处提供托管JavaScript的原始页面。服务器可以选择支持来自任何来源的请求,或者仅支持一组已知的可信来源的请求。允许任何来源都是安全风险,因为这样做会增加跨站请求伪造(CSRF)的风险。

因此,您需要启用CORS。

这是解释如何在ASP.Net Web API中执行此操作的链接

http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-
in-web-api#enable-cors

此处描述的实现可让您指定其他内容

  • 针对每个动作,每个控制器或全局的CORS支持
  • 支持的来源
  • 启用CORS aa控制器或全局级别时,支持的HTTP动词
  • 服务器是否支持通过跨域请求发送凭据

通常,这可以正常工作,但是您需要确保您已意识到安全风险,尤其是在允许来自任何域的跨源请求的情况下。允许这样做之前,请仔细考虑。

关于哪种浏览器支持CORS,维基百科表示以下引擎支持它:

  • 壁虎1.9.1(FireFox 3.5)
  • WebKit(Safari 4,Chrome 3)
  • MSHTML / Trident 6(IE10),在IE8和9中部分支持
  • 普雷斯托(歌剧12)

http://en.wikipedia.org/wiki/Cross-
origin_resource_sharing#Browser_support



 类似资料:
  • 问题内容: 我希望我的React.js应用程序中的类可以从-files中导出,就像从CSS模块中导出时一样,但是我找不到任何现成的解决方案来解决这个问题。 我找到了在使用Create React App创建的应用程序中设置CSS模块的指南。 我了解您需要运行并以某种方式重写配置文件, 但是如何-我不明白。 问题答案: 您需要在项目中安装下一个npm-packages: 手写笔 测针器 CSS加载器

  • 问题内容: 是否有任何网络浏览器支持动画光标? 我一直在网上搜索以将自定义光标添加到我的Web应用程序中。我发现很多非动画(.cur)和动画(.ani)游标,并使用正确的CSS,以便我的应用程序具有自定义游标!我尝试过的Web浏览器似乎不支持动画光标,我想知道是否有任何方法可以将动画光标放入我的Web应用程序中。 问题答案: 经过更多研究后,我认为目前尚不可能。截至2012年2月8日,似乎没有任何

  • 我有一个嵌入jetty服务器的Gradle Java项目。我想为同一个项目启用web应用程序支持。 Intellij IDEA帮助说明如何在下面的链接中为现有项目启用。https://www.jetbrains.com/help/idea/2016.1/enabling-web-application-support.html#d1788100e258 但是这个过程使用了Intellij IDEA

  • 问题内容: 我正在考虑如何使Android的支持库在Eclipse之外包含和编译。我使用Linux作为构建环境,没有使用任何IDE来创建应用程序,仅使用基本的Android SDK。我仅获得了有关Eclipse的此问题的答案,但是如何仅使用Ant和Android SDK呢? 问题答案: 假设您没有使用: 步骤1:将SDK 复制或从SDK 复制到项目目录中。 步骤2:没有步骤2。 选择是否要使用本机

  • 目前,我有一个多线程java应用程序,它使用部署在weblogic server 11g中的3个线程。但当应用程序运行时,我只能看到weblogic控制台中有一个运行执行线程。 有人能解释一下我的应用程序线程和weblogic中的执行线程之间是否有任何区别吗?

  • 我正在尝试为一个新的Java项目启用Web应用程序支持。我正在遵循以下支持页面中提到的步骤。 我是不是漏掉了什么?