关于angularjs:请求的资源不支持http方法’OPTIONS’。

The requested resource does not support http method 'OPTIONS'.?

我从angular.js客户端向asp.net web api PUT方法发出以下请求:

1
2
3
4
5
6
7
8
var org = {
                  OrgId: 111,
                  name: 'testing testing'
          };
$http.put("http://localhost:54822/api/data/putorganisation/1/", org).then(function(status) {
         console.log("success PUT");
         return status.data;
});

但是获得以下errormsg(在fiddler中):

1
{"message":"The requested resource does not support http method 'OPTIONS'."}

这是我的asp.net web api web.config文件的一部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 <system.webServer>
    <httpProtocol>
      <customHeaders>
       
       
       
      </customHeaders>
    </httpProtocol>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
     
      <remove name="WebDAV" />
    </handlers>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule" />
    </modules>
  </system.webServer>

数据控制器web api:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public HttpResponseMessage Options()
{
            var response = new HttpResponseMessage();
            response.StatusCode = HttpStatusCode.OK;
            return response;
}

public HttpResponseMessage PutOrganisation(int id, [FromBody]Organisation org)
{
  var opStatus = _Repository.UpdateOrganisation(org);
  if (opStatus.Status)
  {
     return Request.CreateResponse<Organisation>(HttpStatusCode.Accepted, org);
  }

return Request.CreateErrorResponse(HttpStatusCode.NotModified, opStatus.ExceptionMessage);
}

这是我的问题:为什么我在fiddler(工程)中使用与angularclient(不起作用)完全相同的请求时得到errormsg(见上文)?


我知道这是一个老问题,但我遇到了同样的问题,并认为我可以帮助其他人试图找出答案。

我通过删除Web.config中的2个处理程序配置解决了这个问题:

1
2
3
4
5
6
<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <!--<remove name="OPTIONSVerbHandler" />-->
  <remove name="TRACEVerbHandler" />
  <!---->
</handlers>

我不知道为什么它解决了这个问题,但我的工作原理是默认情况下禁止OPTIONS请求。当通过angular发送请求时,它首先在PUT请求之前发送OPTIONS请求,因此它永远不会到达PUT请求,因为第一个OPTIONS请求被拒绝作为api上的无效http方法。

在fiddler中,我假设它只发送PUT请求(我使用Postman Web应用程序手动发送请求时观察到相同的行为)。因此它会跳过禁止的OPTIONS请求并成功。


我也遇到了同样的问题,经过一些研究,我对web.config和Global.asax.cs文件进行了以下更改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<configuration>

  <system.webServer>
    <directoryBrowse enabled="true" />
    <validation validateIntegratedModeConfiguration="false" />
    <httpProtocol>
      <customHeaders>
       
       
       

      </customHeaders>
    </httpProtocol>
    <handlers>
      <remove name="WebDAV" />
      <remove name="OPTIONSVerbHandler"/>
      <remove name="TRACEVerbHandler" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

     
     
     
    </handlers>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule" />
      <remove name="ApplicationInsightsWebTracking" />
     
    </modules>
  </system.webServer>

</configuration>

添加以下代码global.ascx.cs

1
2
3
4
5
6
7
8
9
10
protected void Application_BeginRequest()
{
    if (HttpContext.Current.Request.HttpMethod =="OPTIONS")
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods","GET, POST, PUT, PATCH, DELETE, OPTIONS");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept");
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age","1728000");
        HttpContext.Current.Response.End();
    }
}


是的,老人但是好东西。我有同样的问题和症状,但我的解决方案是自己造成的。无论如何我会分享它。我们的服务配置启动时在所有MapHttpRoute调用中使用的控制器的方式包括[DisableCors]属性。一旦我重新配置我的本地机器启动以使用不同的控制器,一切都有效。因此,如果您已经完成了此处列出的所有其他内容,请检查您的控制器并确保您没有像我一样做一些愚蠢的事情。


安德鲁是对的,这很可能是一个CORS问题。您需要的是将EnableCors属性添加到您的Controller类中,以便看起来像这样

1
2
3
4
 [EnableCors(origins:"https://example.com,http://example.org", headers:"*", methods:"*")]
    public class  TestController : ApiController
    {
         // your code

在此堆栈溢出帖子中提到了执行此操作的另一种方法


这几乎肯定是一个CORS问题。我首先要了解它,以确保您了解这是什么以及为什么它很重要。我猜你的服务器配置不正确。

不幸的是,我对.net知之甚少,但是.net的CORS教程描述了你应该做的很清楚。

看起来您缺少EnableCors注释。看起来您需要向控制器添加类似[EnableCors("*","*","*")]的内容。不必明确处理OPTIONS。当然,在生产中,您不希望使用通配符进行CORS处理。它们应该更具体,但这对于测试来说很好。


显然,在某些情况下,OPTIONS请求在"真实"请求之前发送,以确定真实请求是否因CORS而安全发送。请参阅以下MS文章:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api并搜索"预检请求"。

以下一些问答也可能有所帮助:

  • jQuery $ .ajax(),$。post在Firefox中将"OPTIONS"作为REQUEST_METHOD发送
  • Chrome中的AJAX发送OPTIONS而不是GET / POST / PUT / DELETE?
  • 为什么这个jQuery AJAX PUT在Chrome中工作但不在FF中工作
  • 如何在ASP.NET MVC / WebAPI应用程序中支持HTTP OPTIONS动词