我在Web服务器上有一个小的Web API应用程序,一个GET方法返回3个记录,一个POST方法接受一个对象,然后为它分配一个ID并返回相同的对象。
我正在从本地网络应用程序进行ajax调用,并测试我的CORS实现。到目前为止,几乎所有事情都运作良好。如果我没有指定Access-Control-Allow-Origin(现在只设置为*
),我的呼叫是不允许的(我期望的),但我也尝试指定Access-Control-Allow-方法并不像我的输入限制了特定的调用。
例如,这是我的web.config包含的内容:
<httpProtocol>
<customHeaders>
<clear />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type, Authorization, Accept, X-Requested-With " />
<add name="Access-Control-Allow-Methods" value="OPTIONS, GET" />
</customHeaders>
</httpProtocol>
我只列出了OPTIONS
和GET
,但我仍然可以发出POST请求。同样,如果我将其设置为"OPTIONS, POST"
,我仍然可以发出GET请求。
修改
根据@geekonaut下面的回答,我能够看到这个功能,我期待。我尝试了PUT
请求,而不是GET
或POST
,但后来我收到了OPTIONS
(预检)请求不允许的错误。我首先需要在Global.asax.cs
文件中添加一个部分来接受该方法,然后如果我在我的web.config PUT
值中切换添加/删除Access-Control-Allow-Methods
,我看到了如果它被列出,它只会允许该方法。
protected void Application_OnBeginRequest()
{
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.StatusCode = 200;
HttpContext.Current.Response.End();
}
}
答案 0 :(得分:3)
CORS不会根据其方法阻止简单(甚至预检)的POST
请求。
例如,Access-Control-Allow-Methods
仅对使用简单的跨源表单无法完成的请求有效。
这意味着:GET
和POST
可以跳过the spec中描述的Access-Control-Allow-Methods
:
在此规范之外生成的简单跨源请求 (例如使用 GET或POST 或。的跨源表单提交 通常由脚本元素产生的跨源GET请求 包括用户凭据,因此资源符合此要求 必须始终准备规范以期望简单的交叉起源 请求凭证。
因此,简单请求具有重要意义的资源 除了检索之外,必须保护自己免受跨站请求 Forgery(CSRF)要求在其中包含一个不可思议的令牌 明确提供的请求内容。
(强调我的)