Cors 错误(无 'Access-Control-Allow-Origin'/它没有 HTTP 正常状态。),当尝试从 Web 应用程序获取数据时
Cors Errors (No 'Access-Control-Allow-Origin' / It does not have HTTP ok status.), when trying to get data from web app
我得到了前端代码,它从我的 ASP.NET Web 应用程序中获取了一些数据。
$.ajax({
url: http://webApiURL,
method: "GET",
contentType: "application/json;odata=verbose",
headers: { "accept": "application/json;odata=verbose" },
success: function (data) {
new WorkTimer(data, "o365cs-nav-centerAlign"); //code that display data further in html
},
});
ASP.NET Web App 非常简单,我认为这里重要的代码是:
public class HPMController : ApiController
{
[HttpGet]
[ActionName("WorkTime")]
public HttpResponseMessage GetWorkTime(string param)
{
using (HPMEntities db = new HPMEntities())
{
var answer = db.Database.SqlQuery<string>("HPM.dbo.someProcedure " + param).First();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, answer);
response.Headers.Add("Access-Control-Allow-Origin", "*");
return response;
}
}
}
在我的开发计算机上一切正常,而且,只要 Web 应用程序托管在我的 IIS (win10) 上,它在我们 Intranet 中的其他计算机上也可以正常工作。但是当我将网络应用程序移动到服务器(winServer2012R2)时,浏览器出现错误:
Access to XMLHttpRequest at 'http://serverURL' from origin 'http://websiteURL' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
我深入研究了一下,然后尝试将此添加到 web.config 的网络应用程序中:
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Methods" value="*"/>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Headers" value="*"/>
</customHeaders>
</httpProtocol>
</configuration>
但它只给我带来了其他错误:
Access to XMLHttpRequest at 'http://serverURL' from origin 'http://websiteURL' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
目前我不知道如何解决这个问题。 Web 应用程序在其他主机上移动时会改变行为,这对我来说很奇怪。
我找到了解决办法。问题出在 IIS 版本上,它在 winServer2012R2 上是 8.5,无法在此 OS 版本上升级。出于某种原因,代码中定义的 Headers 在 IIS 8.5 中被忽略,我无法弄清楚如何在 web.config 中正确定义它们,其中没有被忽略。 (这是发生第二个错误的原因)我只是将应用程序移到不同的服务器(winServer2019)上,它现在可以工作了。
我得到了前端代码,它从我的 ASP.NET Web 应用程序中获取了一些数据。
$.ajax({
url: http://webApiURL,
method: "GET",
contentType: "application/json;odata=verbose",
headers: { "accept": "application/json;odata=verbose" },
success: function (data) {
new WorkTimer(data, "o365cs-nav-centerAlign"); //code that display data further in html
},
});
ASP.NET Web App 非常简单,我认为这里重要的代码是:
public class HPMController : ApiController
{
[HttpGet]
[ActionName("WorkTime")]
public HttpResponseMessage GetWorkTime(string param)
{
using (HPMEntities db = new HPMEntities())
{
var answer = db.Database.SqlQuery<string>("HPM.dbo.someProcedure " + param).First();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, answer);
response.Headers.Add("Access-Control-Allow-Origin", "*");
return response;
}
}
}
在我的开发计算机上一切正常,而且,只要 Web 应用程序托管在我的 IIS (win10) 上,它在我们 Intranet 中的其他计算机上也可以正常工作。但是当我将网络应用程序移动到服务器(winServer2012R2)时,浏览器出现错误:
Access to XMLHttpRequest at 'http://serverURL' from origin 'http://websiteURL' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
我深入研究了一下,然后尝试将此添加到 web.config 的网络应用程序中:
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Methods" value="*"/>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Headers" value="*"/>
</customHeaders>
</httpProtocol>
</configuration>
但它只给我带来了其他错误:
Access to XMLHttpRequest at 'http://serverURL' from origin 'http://websiteURL' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
目前我不知道如何解决这个问题。 Web 应用程序在其他主机上移动时会改变行为,这对我来说很奇怪。
我找到了解决办法。问题出在 IIS 版本上,它在 winServer2012R2 上是 8.5,无法在此 OS 版本上升级。出于某种原因,代码中定义的 Headers 在 IIS 8.5 中被忽略,我无法弄清楚如何在 web.config 中正确定义它们,其中没有被忽略。 (这是发生第二个错误的原因)我只是将应用程序移到不同的服务器(winServer2019)上,它现在可以工作了。