问题描述
我有前端代码,可以从ASP.NET Web App中获取一些数据。
$.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;
}
}
}
只要我的IIS(win10)上托管了Web应用程序,一切都可以在我的开发计算机上正常运行,并且在我的Intranet中的其他计算机上也可以正常运行。但是,当我将Web应用程序移动到服务器(winServer2012R2)时,浏览器出现错误:
CORS策略已阻止从来源“ http:// websiteURL”访问“ http:// serverURL”处的XMLHttpRequest:对预检请求的响应未通过访问控制检查:否“ Access-Control-Allow-来源的标头出现在请求的资源上。
我进行了一些挖掘,并尝试将其添加到Web应用程序的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>
但这只会给我带来其他错误:
CORS策略已阻止从来源“ http:// websiteURL”访问“ http:// serverURL”处的XMLHttpRequest:对预检请求的响应未通过访问控制检查:它没有HTTP正常状态。
到目前为止,我不知道该如何解决。 Web应用程序在其他主机上移动时会更改行为,这令我感到奇怪。
解决方法
我想出了一个解决方案。问题出在IIS版本上,该版本在winServer2012R2上为8.5,无法在此OS版本上升级。出于某些原因,在IIS 8.5中会忽略代码中定义的标头,而我无法弄清楚如何在web.config中正确定义它们,在何处不忽略它们。 (这是发生第二个错误的原因)我只是将应用程序移到了其他服务器(winServer2019)上,并且现在可以正常工作。