选项405(方法不允许)web api 2

时间:2014-10-30 09:32:31

标签: c# asp.net-mvc cors asp.net-web-api2

我已经创建了一个web api 2,我试图对它进行跨域请求,但是我收到了以下错误:

  

选项http://www.example.com/api/save 405(方法不允许)

我已经浏览了一下这个问题的大多数解决方案都说我需要从NuGet安装COR并启用它,所以我已经安装了包并用

标记了我的控制器
[EnableCors("*", "*", "*")]

但这仍然没有解决问题。

我的ApiController只有以下Save方法:

[ResponseType(typeof(int))]
public IHttpActionResult Save(Student student)
{
    if (ModelState.IsValid)
    {
        using (StudentHelper helper = new StudentHelper())
        {
            return Ok(helper.SaveStudent(student));
        }
    }
    else
    {
        return BadRequest(ModelState);
    }
}

这是我来自不同领域的js:

$.ajax({
    type: "POST",
    crossDomain: true,
    data: JSON.stringify(student),
    crossDomain: true,
    url: 'http://www.example.com/api/save',
    contentType: "application/json",
    success: function (result) {
        console.log(result);
    }
});

我还需要做些什么来启用它吗?

6 个答案:

答案 0 :(得分:22)

通过nuget为您的项目安装CORS Web API包:

  

安装包Microsoft.AspNet.WebApi.Cors

在WebApiConfig中添加以下行:

var cors = new EnableCorsAttribute ("*", "*", "*");
config.EnableCors (cors);

答案 1 :(得分:3)

确保您将OPTIONS作为web.config中允许的动词之一,并且它由默认处理程序处理。

<system.web>
...
  <httpHandlers>
  ... 
    <add path="*" verb="OPTIONS" type="System.Web.DefaultHttpHandler" validate="true"/>
    <add path="*" verb="TRACE" type="System.Web.DefaultHttpHandler" validate="true"/>
    <add path="*" verb="HEAD" type="System.Web.DefaultHttpHandler" validate="true"/>

答案 2 :(得分:2)

这个解决了我的问题

第1步

安装Cors软件包 Microsoft.AspNet.WebApi.Cors (右键单击解决方案>管理Nuget软件包>然后搜索Cors)

第2步

将此行放入 WebApiConfig.cs 文件

public static void Register(HttpConfiguration config)
{
    config.EnableCors(new EnableCorsAttribute("http://localhost:3000", headers: "*", methods: "*"));        
    .
    .
    .        
} 

http://localhost:3000更改为API调用者的地址

答案 3 :(得分:1)

最后,我通过更改ajax请求解决了这个问题。我发现OPTIONS预检仅在某些情况下发送 - 如果请求包含的Content-Type不是以下类型之一,则会发出其中一个:

  • 应用程序/ x-WWW窗体-urlencoded
  • 的multipart / form-data的
  • 文本/纯

因此,删除我的ajax请求中的content-type并将其更改为以下内容:

$.ajax({
    type: "POST",
    crossDomain: true,
    data: student,
    dataType: 'json',
    url: 'http://www.example.com/api/save',
    success: function (result) {
        console.log(result);
    }
});

我能够让它发挥作用。

This page has useful information about simple requests and how to avoid preflight requests

答案 4 :(得分:0)

还可以尝试使用withcredentials ajax request option

    $.ajax({
     type: "POST",
     crossDomain: true,
     data: JSON.stringify(student),
     withCredentials: true,
     url: 'http://www.example.com/api/save',
     contentType: "application/json",
     success: function (result) {
      console.log(result);
     }
   });

答案 5 :(得分:0)

我正在从angular应用程序调用.net Web API,但出现 405方法不允许错误。我发现我在角度http.post中缺少标题选项。因此,我在angular的http请求中添加了标题'Content-Type': 'application/json',解决了我的错误并成功执行了wpi操作。

因此,要解决该错误,请在EnableCors需要引用(WebAPIConfig)中的.net Web api中使用System.Web.Http.Cors。像这样:

EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);

并在有角http中添加标题。希望对别人有帮助。