我已经创建了一个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);
}
});
我还需要做些什么来启用它吗?
答案 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
不是以下类型之一,则会发出其中一个:
因此,删除我的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中添加标题。希望对别人有帮助。