對於相同的調用和來自同一瀏覽器的相同JS代碼,請求標頭如何可能不同?爲什麼同一個ajax調用有不同的請求頭文件?
我有一個Web API項目,我打電話給這個API的方法來自兩個不同的項目(CORS calls),使用$http.get
方法AngularJs 1.X
。
$http.get("http://local.api:9002/api/default/get")
.then(function success(response, status, headers, config) {
console.info(response);
},
function error(response, status, headers, config) {
console.info(response);
}
);
這是從兩個前端UI用來調用API的代碼。
但是,對於其中一個調用成功,另一個失敗,指出以下錯誤。
對預檢請求的響應未通過訪問控制檢查:請求的資源上沒有「Access-Control-Allow-Origin」標頭。
經過觀察,我發現兩個調用的請求標頭有所不同。
請求標頭調用成功 - AngularJS v1.6.4
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Connection:keep-alive
Host:local.api:9002
Origin:http://local.ui.one:9001
Referer:http://local.ui.one:9001/
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36
響應頭爲成功
Access-Control-Allow-Origin:http://local.ui.one:9001
Cache-Control:no-cache
Content-Length:19
Content-Type:application/json; charset=utf-8
Date:Fri, 05 May 2017 01:05:05 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
請求頭呼叫失敗通話 - AngularJS v1.2.17
爲呼叫失敗Cache-Control:no-cache
Content-Length:113
Content-Type:application/json; charset=utf-8
Date:Fri, 05 May 2017 01:22:14 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
這些
響應頭是兩個請求頭是在第二呼叫附加。
Access-Control-Request-Headers:cache-control,if-modified-since,pragma,x-requested-with
Access-Control-Request-Method:GET
注:
- 我的UI一個和API都在同一
Visual Studio Solution
,而UI二是在不同的Solution
。我相信這不是原因,但我可能是錯的。 - 我在這兩個UI項目中都有不同的AngularJS版本。這可能是一個可能的原因嗎?
編輯
至於建議的@Phil,我更新了我的後臺API來處理從我的第二UI項目未來的預檢要求。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//Some API routes here...
var enableCorsAttribute = new EnableCorsAttribute(
// Comma separated whitelist of allowed domains, notice no slash ('/') at the end of domain
"http://local.ui.two:9003,http://local.ui.one:9001",
// Allowed Custom Headers
"Origin, X-Requested-With, Content-Type, Accept, Authorization, Cache-Control, If-Modified-Since, Pragma",
// Allowed methods
"GET, PUT, POST, DELETE, OPTIONS"
);
config.EnableCors(enableCorsAttribute);
}
}
並在Global.asax
註冊了此WebApiConfig。
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
而且它也開始處理來自第二UI項目的調用,儘管請求標頭不同。
'我有兩個UI項目不同AngularJS版本。這可能是一個可能的原因嗎?「是的。不要這樣做:) – Phix
@Pix,謝謝你的快速回復。但是,第二個項目是現有的項目,升級AngularJS版本將不具有成本效益。儘管我可以在我的第一個項目中始終降級版本。至少我可以試試看。 –
@Phix,我試着將第二個項目升級到Angular JS v1.6.4,並將第一個項目降級到Angular JS v1.2.17。結果是一樣的。我相信這不是Angular JS的版本。 –