No 'Access-Control-Allow-Origin' header is present on the requested resource error bypassed by fidler
我需要使用我公司的身份验证服务,该服务在远程服务器上运行。 我一直在尝试使用jquery AJAX对服务(API)进行ajax调用,如下所示....
1 2 3 4 5 6 7 8 9 10 | var uri ="http://Company/Authentication/AuthAPI"; $.ajax(uri, { type:"POST", data: JSON.stringify(user), contentType:"application/json", success: function () { //here reload the page so that the new vacancy will be showed alert("logged in"); } }); |
我在Chrome控制台中收到此错误...
请求的资源上没有"Access-Control-Allow-Origin"标头,
我经历了这个,并且知道我必须在服务器端将Access-Control-Allow-Origin标头设置为*或将其设置为我的域。
现在,实际的问题是,当我使用fidler打同样的身份验证服务时,一切似乎工作得很好,这是让我疯狂的家伙,请赐教
编辑:不知何故,这似乎也适用于.NET MVC代码...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public UserData AuthenticateUser(User userDetails) { try { using (var _client = new HttpClient()) { var result = new UserData(); _client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); string subUri = Utilities.GetConfigValueFromSection(ConfigurationConstants.AuthenticationServiceSection, ConfigurationConstants.Authenticate); var postTask = _client.PostAsJsonAsync(_uri + subUri, userDetails).ContinueWith((taskWithResponse) => { var response = taskWithResponse.Result; var readTask = response.Content.ReadAsAsync<UserData>(); readTask.Wait(); result = readTask.Result; }); postTask.Wait(); return result; } } |
感谢Jai,我明白了我必须要做的事情......最后这很简单..
以下是解决方案的确切代码......
第1步:角度服务,它使用内置的$ http服务对我的web-api进行AJAX调用。
这里我的web-api是ProxyController
1 2 3 4 5 6 | $http.post('/Proxy', user).then(function (response) { successCallBack(response.data); //this is callback function //this function handles the data returned by the API }, function (response) { console.log(response); }); |
第2步:ProxyController实现。
这是作为代理服务器的web-api。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class ProxyController : ApiController { private string AuthenticationUri ="http://authencationserver/api/AuthenticateUser/Authenticate"; public async Task<AuthenticationResultObject> Post(UserObject user) { // this controller just acts as an interface between the client and the actual server. //We are going to get the information from the actual server by making an ajax call from here //the server address for authenticating is http://authencationserver/api/AuthenticateUser/Authenticate //we need to hit this address with an user object HttpClient client = new HttpClient(); HttpResponseMessage response = await client.PostAsJsonAsync(AuthenticationUri, user); if (response.IsSuccessStatusCode) { var result = response.Content.ReadAsStringAsync(); var returnedObject = JsonConvert.DeserializeObject<AuthenticationResultObject>(result.Result); //we need the above statement to deserialize the returned json to a javascript object. //AuthenticationResultObject models the data that will be returned by the remote API return returnedObject; } return null; } } |
请参阅允许所有RestClients,但是对于javascript代码来获取数据跨域,您必须启用CORS。
另一种方法是在服务器上创建Web代理并调用该代理以从该URL获取数据并将其返回给您。
这里可能是语法错误:
1 | $.ajax(uri{ |
将其更改为:
1 2 | $.ajax({ url: uri |
我仍然建议您调用上面添加的本地方法。
该方案被Javascript阻止。即使标题中不存在访问控制允许来源,您也可以在iframe中加载内容。小提琴手可能做的是一样的。在iframe中加载内容,然后使用内容将响应返回给您。
这是为了测试目的:
在终端命中命令
chromium-browser --disable-web-security http:// localhost /
此命令禁用Web安全性,您可以访问跨域网站。