请求的资源不支持http方法'OPTIONS'。

时间:2014-06-22 15:05:24

标签: angularjs rest asp.net-web-api cors

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

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中):

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

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

 <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type,x-xsrf-token,X-Requested-With" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
      </customHeaders>
    </httpProtocol>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
      <remove name="WebDAV" />
    </handlers>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule" />
    </modules>
  </system.webServer>

数据控制器web api:

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(见上文)?(

5 个答案:

答案 0 :(得分:7)

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

<configuration>

  <system.webServer>
    <directoryBrowse enabled="true" />
    <validation validateIntegratedModeConfiguration="false" />
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, PATCH, DELETE, OPTIONS" />
        <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />

      </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" />

      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule" />
      <remove name="ApplicationInsightsWebTracking" />
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
    </modules>
  </system.webServer>

</configuration>

添加以下代码global.ascx.cs

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();
    }
}

答案 1 :(得分:1)

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

不幸的是,我对.net并不了解,但是CORS tutorial for .net描述了你应该做的很清楚。

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

答案 2 :(得分:1)

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

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

stack overflow post

中提到了另一种方法

答案 3 :(得分:0)

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

以下Q&amp; As中的一些内容也可能有所帮助:

答案 4 :(得分:0)

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