json,web service" undefined error#34;

时间:2013-05-02 16:02:45

标签: jquery json web-services

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

为什么?

3 个答案:

答案 0 :(得分:1)

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

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

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

CORS请求?那是什么?

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怎么样?

要在此方案中使用JSONP,您必须更改服务以通过GET返回信息,因为您无法使用JSONP进行POST。 (This answer指向一些黑客,但我认为这太过分了。)

我无法访问HTTP服务器或Web服务。根本没有解决方法呢?

有一些选项,但实际上没有一个是干净的解决方法。您可以设置一个应用程序(在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"