标头无法使用跨域传入 ajax

Posted

技术标签:

【中文标题】标头无法使用跨域传入 ajax【英文标题】:Header can't pass in ajax using cross domain 【发布时间】:2017-11-14 01:33:05 【问题描述】:

我为我的网站使用了两个项目。一个用于 Mvc 项目和 Api 项目。 我在 Api 项目中的 web.config 文件中添加了以下代码,

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization

Api项目中的Action方法如下,

[HttpPost]
[Route("api/ajaxapi/caselistmethod")]
public List<CaseValues> AjaxCaseListMethod()

            List<CaseValues> caseList = new List<CaseValues>();
            return caseList;

在 Mvc 项目中的 ajax 调用如下,

$.ajax(
            type: "POST",
            url: "http://localhost:55016/api/ajaxapi/caselistmethod",
            beforeSend: function (request) 
                request.setRequestHeader("Authorization", getCookie("Token"));
            ,
            success: function (response) 
            
);

但仍显示如下错误,

选项http://localhost:55016/api/ajaxapi/caselistmethod 405(不允许的方法) XMLHttpRequest 无法加载 http://localhost:55016/api/ajaxapi/caselistmethod。预检响应包含无效的 HTTP 状态代码 405

但没有 Header 可以正常工作。我还需要传递标题。所以请给点建议。

谢谢...

【问题讨论】:

【参考方案1】:

options方法需要开启options的pre-flight请求才能成功,这又需要发送授权头。

目前尚不清楚您是如何在 Web.Config 中启用标头或您使用什么来托管您的服务,因此很难提出确切的解决方案。如果您使用 IIS,请查看 - enabling cross-origin resource sharing on IIS7 以确保 OPTIONS 未被 IIS 阻止。您可能需要删除现有的处理程序或启用 OPTIONS。

或者,您可以在方法上使用 EnableCors 属性来允许为该路由启用“选项”。

【讨论】:

终于找到了解决方案,你节省了我的时间。谢谢@Alexei【参考方案2】:

Chrome 将发送一个预检请求(OPTIONS 方法)来查找 CORS 标头,然后发送 POST 请求。

但您不允许使用 OPTION 方法。

试试

Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS

【讨论】:

我不相信 Access-Control-Allow-Methods 会影响 OPTIONS 请求本身的 405。您不需要将“OPTIONS”添加到此列表中,因为它不太可能进行 OPTIONS 跨域调用(飞行前 OPTIONS 调用不被浏览器视为“跨域”,因为它是由浏览器本身而不是客户端代码进行的) 在允许 OPTIONS 方法后也没有任何反应。 @S.Dev

以上是关于标头无法使用跨域传入 ajax的主要内容,如果未能解决你的问题,请参考以下文章

带有 jquery.ajax() 的跨域“授权”标头

无法从前端 JavaScript 访问跨域响应标头

使用 Spring MVC 4 处理跨域预检 AJAX OPTIONS 请求

Ajax跨域请求设置标头失败

跨域 ajax 请求中的预检标头未解决授权标头

如何在ajax中解决跨域[重复]