0
 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."

为什么?

4

3 回答 3

1

您的代码实际上是在尝试发出 CORS 请求,而不是普通的 POST。

现代浏览器只允许 Ajax 调用与源 HTML 页面位于同一域中的页面。

换句话说,只要尝试发出 Ajax 请求的 HTML 页面与目标 URL(在您的情况下为lp18mobile.azurewebsites.net:80)不在同一个域中,浏览器就不会进行调用(如您所料)。相反,它将尝试发出 CORS 请求。请记住,对于浏览器,localhost:80localhost:5733(相同的主机,但不同的端口)是不同的域

CORS 请求?那是什么?

维基百科说跨域资源共享(CORS)是一种允许网页XMLHttpRequests进入另一个域的机制。由于同源安全策略,否则此类“跨域”请求将被 Web 浏览器禁止。

简而言之,要执行 CORS 请求,您的浏览器:

  • 将首先向目标 URL 发送OPTION请求
    • 它就是这样发现的Origin ... is not allowed by Access-Control-Allow-Origin.
  • 然后,只有当服务器响应OPTION包含足够的标头(Access-Control-Allow-Origin其中之一)以允许 CORS 请求时,浏览器才会执行调用(几乎与 HTML 页面位于同一域中的方式完全相同)。
    • 如果没有出现预期的标题,浏览器就会放弃(就像它对你所做的那样)。

如何让它发挥作用?

如果您无法更改 Web 服务或托管它的 HTTP 服务器lp18mobile.azurewebsites.net:80:除了将该 HTML 文件部署在位于服务的同一域的服务器中(在您的场景中, )之外,您无能为力。

如果您这样做可以更改 Web 服务:要在 ASP.NET Web 服务中启用 CORS,您只需在源页面中添加以下行即可添加标题:

Response.AppendHeader("Access-Control-Allow-Origin", "*");

但这只是帮助您入门的一种解决方法。您真的应该更多地了解 CORS 标头。更多详细信息:使用 CORS 跨域访问 ASP.NET 服务

如果您这样做可以更改 Web 服务的 HTTP 服务器:检查此链接以了解如何在 Apache 上执行此操作。单击此处了解如何在 IIS7 中启用它或单击此处在 IIS6 中启用它。

JSONP 怎么样?

要在这种情况下使用 JSONP,您必须更改服务以通过 GET 返回信息,因为您不能使用 JSONP 进行 POST。(这个答案指向一些黑客,但我认为这太过分了。)

我无权访问 HTTP 服务器或 Web 服务。那么根本就没有变通办法吗?

有一些选项,但它们都不是一个干净的解决方法,真的。您可以设置一个应用程序(在您的 HTML 文件的同一域/端口)将每个 TCP/IP 请求转发到lp18mobile.azurewebsites.net:80,然后欺骗您的浏览器。或者您可以在您的域/端口中设置该 Web 服务的镜像。你看,从现在开始,一切都变得太脏了。

于 2013-05-02T16:22:00.793 回答
0

您的数据类型应该是dataType:"jsonp"

于 2013-05-02T16:12:10.297 回答
-1

拼写contentType: "application/jsonp; charset=utf-8"
错误替换为:
contentType: "application/json; charset=utf-8"

于 2013-05-02T16:04:43.360 回答