为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Qyouu 2019-10-09 16:51:42
我已经从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.1Host: host.mywebapidomain.comUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateOrigin: http://mywebapidomain.comAccess-Control-Request-Method: GETAccess-Control-Request-Headers: content-typeConnection: keep-aliveWeb API照原样返回405方法不允许。HTTP/1.1 405 Method Not AllowedCache-Control: no-cachePragma: no-cacheContent-Type: application/xml; charset=utf-8Expires: -1Server: Microsoft-IIS/8.0X-AspNet-Version: 4.0.30319X-Powered-By: ASP.NETDate: Mon, 30 Sep 2013 13:28:12 GMTContent-Length: 96<Error><Message>The requested resource does not support http method 'OPTIONS'.</Message></Error>必须有他逻辑...我不知道如何正确编码Options方法,或者控制器是否是放置代码的适当位置。(对我来说)很奇怪,当从Firefox或Chrome浏览器查看Web API站点时,它可以正确响应,但是上面的.ajax调用出错了。如何处理.ajax代码中的“预检”检查?也许我应该在客户端的.ajax逻辑上解决此问题?或者,如果由于不处理OPTIONS动词而在服务器端出现问题。有人可以帮忙吗?这一定是一个非常普遍的问题,如果在这里得到回答,我深表歉意。我进行了搜索,但没有找到有帮助的答案。
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

正如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


查看完整回答
反对 回复 2019-10-09
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

迈克·古德温(Mike Goodwin)的回答很棒,但是当我尝试使用它时,它似乎是针对MVC5 / WebApi 2.1的。Microsoft.AspNet.WebApi.Cors的依赖性在我的MVC4项目中不能很好地发挥作用。


下面是使用MVC4在WebApi上启用CORS的最简单方法。


请注意,我已允许所有操作,建议您将Origin限制为只希望您的API服务的客户端。允许一切都存在安全风险。


Web.config:

<system.webServer>

    <httpProtocol>

      <customHeaders>

        <add name="Access-Control-Allow-Origin" value="*" />

        <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, HEAD" />

        <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />

      </customHeaders>

    </httpProtocol>

</system.webServer>

BaseApiController.cs:

我们这样做是为了允许使用OPTIONS http动词


 public class BaseApiController : ApiController

  {

    public HttpResponseMessage Options()

    {

      return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };

    }

  }


查看完整回答
反对 回复 2019-10-09
  • 3 回答
  • 0 关注
  • 707 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信