在过去的两天里,我一直在努力使用webapi(asp.net)和ajax查询。我可能已经在互联网上阅读了所有可能的解决方案,但它仍然无法在我的机器上运行。
我已尝试使用简单示例项目(NB:localhost
替换为LH
)的步骤:
[不工作]
public static void Register(HttpConfiguration config)
{
config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
// omitted
}
[不工作]
[EnableCors("*", "*", "GET,POST,PUT,OPTIONS")]
public class ValuesController : ApiController
{ /* code goes here */}
[不工作]
[EnableCors("*","*","PUT")]
public void Put(int id, string value)
{
values[id] = value;
}
[不工作]
我也试过添加这些:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
</httpProtocol>
[不工作]
最后,我使用IIS管理与第4点相同。
FF F12工具网络面板的结果:
GET LH:8821/api/values 200 OK 229ms ["Item1", "Item2", "Item3"]
PUT LH:8821/api/values 405 Method Not Allowed 114ms "NetworkError: 405 Method Not Allowed - LH:8821/api/values"
POST LH:8821/api/values 405 Method Not Allowed 123ms "NetworkError: 405 Method Not Allowed - LH:8821/api/values"
我做错了什么,还是我错过了其他一些设置?
我取得的最佳成绩是GET
和POST
工作,但是当谈到PUT
时,我总是得到405 - 为什么?
答案 0 :(得分:1)
对于某些CORS请求,浏览器/ jQuery / ajax在发送对资源的实际请求之前发送另一个请求,称为&#34;预检请求&#34;,因为跨站请求可能会对用户数据。
如果满足以下条件,浏览器/ jQuery / ajax可以跳过预检请求:
GET
,HEAD
或POST
,和 上述内容仅略微改编自this link中的信息(&#34; Preflight Requests&#34;)。
与简单的请求不同,&#34; preflighted&#34;请求首先通过OPTIONS
方法向另一个域上的资源发送HTTP请求,以确定实际请求是否可以安全发送。
我的猜测是你没有一个处理控制器中OPTIONS
的动作方法,因此你得到一个405
,即错误与&#34;隐身& #34; OPTIONS
请求,而非PUT
。在最简单的形式中,您可以在控制器中实现这样的动作方法。
public HttpResponseMessage Options()
{
var response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
return response;
}
此外,如果您禁用WebDAV
IIS模块并在web.config中设置runAllManagedModulesForAllRequests="true"
设置,它可能会有所帮助:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
我确定你已经阅读了很多关于这方面的文章,所以你可能已经尝试了我已经说过的部分或全部,但是,由于你的问题中没有说明,我认为它在这里值得一提。
顺便说一句,如果您还没有读过这篇文章,this article by Brock Allen对于任何在Web API 2中乱搞CORS的人来说都是绝对必读的。