function authonticate() {
$.ajax({
type: "POST",
url: "http://lp18mobile.azurewebsites.net/LP18WS.asmx/AuthonticateUser",
contentType: "application/jsonp; charset=utf-8",
data: {
"some data"
},
dataType: "json",
success: function (msg) {
//success
}
},
error: function (msg) {
//error
},
});
}
我使用Jquery,json,html5,webservice来开发应用程序。
当我运行应用程序时,它将抛出
undefined error at "XMLHttpRequest cannot load http://lp18mobile.azurewebsites.net/LP18WS.asmx/AuthonticateUser.
Origin http://'localhost:5733/..' is not allowed by Access-Control-Allow-Origin."
为什么?
答案 0 :(得分:1)
您的代码实际上是在尝试发出CORS请求,而不是普通的POST。
现代浏览器只允许Ajax调用同一域中的页面作为源HTML页面。
换句话说,每当尝试发出Ajax请求的HTML页面与目标URL(在您的情况下为lp18mobile.azurewebsites.net:80
)不在同一个域中时,浏览器就不会进行调用(如你期待的)。相反,它会尝试发出CORS请求。请注意,对于浏览器,localhost:80
和localhost:5733
(相同的主机,但不同的端口)是不同的域。
Wikipedia says:跨域资源共享(CORS)是一种允许网页将XMLHttpRequests
发送到另一个域的机制。由于 same origin security policy ,网络浏览器会禁止此类“跨域”请求。
简而言之,要执行CORS请求,请使用浏览器:
OPTION
请求
Origin ... is not allowed by Access-Control-Allow-Origin.
OPTION
的响应包含允许CORS请求的adequate headers (Access-Control-Allow-Origin
is one of them)时,浏览器才会执行调用(几乎完全按照它的方式执行如果HTML页面在同一个域中)。
如果您无法更改Web服务或托管它的HTTP服务器:除了在位于同一域的服务器中部署该HTML文件之外,您无法做任何事情。服务(在您的方案中,lp18mobile.azurewebsites.net:80
)。
如果您确实可以更改网络服务:要在ASP.NET网络服务中启用CORS,您只需在源网页中添加以下行即可添加标题:
Response.AppendHeader("Access-Control-Allow-Origin", "*");
但这只是一个让你入门的解决方法。您真的应该了解有关CORS标头的更多信息。更多详细信息请参阅:Using CORS to access ASP.NET services across domains
如果您确实可以更改Web服务的HTTP服务器:检查this link以了解如何在Apache上执行此操作。 Click here了解如何在IIS7中启用它,或here在IIS6中启用它。
要在此方案中使用JSONP,您必须更改服务以通过GET返回信息,因为您无法使用JSONP进行POST。 (This answer指向一些黑客,但我认为这太过分了。)
有一些选项,但实际上没有一个是干净的解决方法。您可以设置一个应用程序(在HTML文件的同一域/端口)将每个TCP / IP请求转发到lp18mobile.azurewebsites.net:80
,然后欺骗您的浏览器。或者,您可以在域/端口中设置该Web服务的镜像。你知道,从现在开始,这一切都变得太脏了。
答案 1 :(得分:0)
您的数据类型应为dataType:"jsonp"
答案 2 :(得分:-1)
拼错contentType: "application/jsonp; charset=utf-8"
替换为:
contentType: "application/json; charset=utf-8"