我是googlin'关于这个问题。这似乎是一种正常行为,因为我试图提出跨站点请求。我根据我在这里阅读的所有内容创建了我的WebService:
<WebMethod()> _
<ScriptMethod(ResponseFormat:=ResponseFormat.Xml, UseHttpGet:=False)> _
Public Function Test() As String
Me.Context.Response.Clear()
Me.Context.Response.AddHeader("Access-Control-Allow-Origin", "*")
Me.Context.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type")
Me.Context.Response.ContentType = "text/plain"
Return "<test>aRetStr</test>"
End Function
这是一个简单的angularJS脚本:
var myModule = angular.module('myModule', [])
myModule.controller('myController', function($scope, userRepository) {
userRepository.getAllUsers().success(function(users) {
alert("success");
var myjson = JSON.parse(users);
$scope.users = myjson})
.error(function(data, status, headers, config) {
alert("error");
});
});
myModule.factory('userRepository', function($http) {
return {
getAllUsers: function() {
$http.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
var url = "http://localhost:2693/service.asmx/Test";
var xml = $http.post(url, {test: 'test'});
return xml;
}
};
});
X-Requested-With = XMLHttpRequest
以及Access-Control-Allow-Origin = *
和text/plain
也是在这里建议的,在我的案例中并不起作用。
实际上,Firebug向我显示了一个OPTIONS请求,并且没有XSS错误,但后续的POST从未发生过。触发错误alert
,当发生这种情况时,回调中的配置如下所示:
Accept : application/json, text/plain, */*
Content-Type : application/json;charset=utf-8
X-Requested-With : XMLHttpRequest
method : POST
我能做什么,为什么没有发生?
答案 0 :(得分:1)
对不起,回复并不完整,但我不完全了解你的后端技术。
基本上,你的Angular应用程序正在向你的服务器发出一个preflighted请求,因为CORS,这意味着它首先在该URL上执行HTTP.OPTIONS请求,并且在从服务器成功响应之后它将生成HTTP.xxx请求(在这种情况下是POST)。
因为您尚未配置您的网络服务以响应HTTP.OPTIONS,我相信这是导致您的错误的原因。
解决方案是将您的Web服务配置为使用以下标头回复HTTP.OPTIONS请求:
response: 200, "ok"
header 'Access-Control-Allow-Origin': http://yoursite.com
header 'Access-Control-Allow-Methods': 'POST, OPTIONS'
请在此处查看有关CORS规范的更多信息:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests