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

24 c# asp.net-mvc cors asp.net-web-api2

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

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

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

[EnableCors("*", "*", "*")]
Run Code Online (Sandbox Code Playgroud)

但这仍然没有解决问题.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我来自不同领域的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);
    }
});
Run Code Online (Sandbox Code Playgroud)

我还需要做些什么来实现这个目标吗?

小智 25

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

安装包Microsoft.AspNet.WebApi.Cors

在WebApiConfig中添加以下行:

var cors = new EnableCorsAttribute ("*", "*", "*");
config.EnableCors (cors);
Run Code Online (Sandbox Code Playgroud)

  • 我必须删除原始参数的星标并设置一个URL:`new EnableCorsAttribute(“ https:// myservicesite”,“ *”,“ *”);`使用星标参数,OPTIONS请求始终发送405错误。 .. (2认同)

Cod*_*ely 6

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

<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"/>
Run Code Online (Sandbox Code Playgroud)


use*_*477 5

This one solved my problem

Step 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: "*"));        
    .
    .
    .        
} 
Run Code Online (Sandbox Code Playgroud)

http://localhost:3000更改为 API Caller 的地址


小智 2

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

  • 应用程序/x-www-form-urlencoded
  • 多部分/表单数据
  • 文本/纯文本

因此,通过删除我的 ajax 请求中的内容类型并将其更改为以下内容:

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

我能够让它工作。

此页面提供有关简单请求以及如何避免预检请求的有用信息

  • 这并不能解决问题,而是可以避免问题。对于那些需要实际支持预检 OPTIONS 请求的人来说,这没有用。 (9认同)
  • 问题的标题是关于 OPTIONS 返回 405 的问题。您完全避免了 OPTIONS 请求。这根本不是这个问题的答案,它只是避免了这个问题。 (4认同)
  • @defines问题是如何通过避免解决问题的调用来解决出现该错误的问题。问题已解决=问题已回答,仅仅因为您不同意解决问题的方法并不意味着您必须否决正确答案。否决票是针对不准确、错误或写得不好的答案。如果你有更好的方式来接受这些选择,那么无论如何,请启发我们所有人,毕竟这就是这个地方的目的,为解决同一问题获得不同的答案 (3认同)
  • 我谨表示不同意。大多数通过问题标题搜索类似问题的人实际上需要解决它,而不是解决它。如果我公开一个公共 API,我需要支持标准操作,而不是指示消费者支持解决方法。顺便说一句,我能够解决这个问题,并为实际问题提供了一个解决方案(许多可能的工作解决方案之一) - 您可以在这里阅读我对类似问题的回答:http://stackoverflow.com/a/37425746/120990 (3认同)
  • @defines 这解决了我的问题,所以不需要投票 - 我的问题是我需要一个简单的请求,因为我不需要支持预检。如果有人正在寻找如何支持预检,这个问题与此无关,而是关于如何让我的 ajax 调用与我的 Web api 对话 - 答案是提出一个简单的请求,而不是启用对飞行前 (2认同)