我遇到了一个看似随机的CORS错误消息的问题。这将在同一个呼叫中使用不同的参数在100次中工作99次。下次我尝试使用先前抛出的Response for preflight is invalid (redirect)
相同参数的调用将成功。它几乎发生在我所拥有的每一个API调用上。
我成功捕获了其中一个错误,我正试图弄清楚它为什么会发生。
登录发生在Angular服务中:
login(UserId: string, password: string) {
const formData = {
'username': UserId,
'password': password
};
const headers = new HttpHeaders();
headers.set('Content-Type', 'application/json');
return this.http.post<AuthResult>(environment.apiUrl + '/Authorization', formData, { headers: headers })
.map(authResult => {
if (authResult && authResult.Succeeded && authResult.Token) {
// handle results here
} else {
console.error(`Error: ${authResult.ErrorMessage}`);
})
.do(response => console.log('Login method finished in Auth Service.'));
}
导致Chrome控制台出错:
Failed to load http://localhost:12711/api/Authorization: Response for preflight is invalid (redirect) :4200/#/login:1
返回的observable的订阅者进入onError
代码块。
奇怪的是,查看Fiddler跟踪显示服务器响应正确的CORS响应,没有重定向:
OPTIONS http://localhost:12711/api/Authorization HTTP/1.1
Host: localhost:12711
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://localhost:4200
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36
Access-Control-Request-Headers: content-type
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/10.0
Access-Control-Allow-Origin: http://localhost:4200
Access-Control-Allow-Headers: content-type
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcUFhHOTA1MlxEb2N1bWVudHNcVlNQcm9qZWN0c1xDYXJlT3B0aW1pemF0aW9uU2VydmljZXNcQ2FyZU9wdGltaXphdGlvblNlcnZpY2VzXGFwaVxBdXRob3JpemF0aW9u?=
X-Powered-By: ASP.NET
Date: Fri, 16 Mar 2018 15:53:47 GMT
Content-Length: 0
我应该注意到这个特别是POST,但我在GET上遇到了同样的错误。我还没有抓住其中一个Fiddler。
99%的API调用工作正常,这一事实告诉我CORS配置正确。 (我想!)
为什么Angular会在没有返回重定向时告诉我有预检重定向问题?为什么它似乎是随机的,它会定期工作但在极少数情况下失败?
我现在正在考虑将Angular作为问题,因为我认为API正在为CORS返回正确的标头。
详细说明:
我在我的开发环境中运行(用于测试)。 Angular 4应用程序使用“ng serve”运行,API在Visual Studio 2015 Enterprise中运行。 API是使用Web API 2编写的REST API。
在部署的环境中也会出现这些错误。 99%的API调用再次正常工作,只有1%失败。
答案 0 :(得分:0)
我能够弄清楚发生了什么,并在another question的帮助下解决了这个问题。 Chrome扩展程序(Digital Guardian)导致Chrome同时在每个CORS预检上发送两个OPTIONS请求。一旦我删除了扩展程序,一切都按预期工作。