看似随机的“预检的响应无效(重定向)”

时间:2018-03-16 16:46:59

标签: angular asp.net-web-api2

我遇到了一个看似随机的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.4.4
  • 节点:9.4.0
  • 操作系统:win32 x64

我在我的开发环境中运行(用于测试)。 Angular 4应用程序使用“ng serve”运行,API在Visual Studio 2015 Enterprise中运行。 API是使用Web API 2编写的REST API。

在部署的环境中也会出现这些错误。 99%的API调用再次正常工作,只有1%失败。

1 个答案:

答案 0 :(得分:0)

我能够弄清楚发生了什么,并在another question的帮助下解决了这个问题。 Chrome扩展程序(Digital Guardian)导致Chrome同时在每个CORS预检上发送两个OPTIONS请求。一旦我删除了扩展程序,一切都按预期工作。