Javascript ajax中的soap不起作用

Javascript ajax中的soap不起作用,javascript,ajax,soap,Javascript,Ajax,Soap,我正在尝试创建一个连接到此web服务的基本HTML页面: 在花了几个小时修改教程和代码示例之后,我完全不知道为什么这不起作用。(根据我的请求,我得到了404,或者根本没有状态…)这是一项任务的一部分,任务是扩展一个已经使用Soap连接到类似web服务的演示,教授们的例子也有同样的问题 我的代码如下: xmlHttpObj.open("POST", "http://wsf.cdyne.com/WeatherWS/Weather.asmx", true); xmlHttpObj.setRequest

我正在尝试创建一个连接到此web服务的基本HTML页面: 在花了几个小时修改教程和代码示例之后,我完全不知道为什么这不起作用。(根据我的请求,我得到了404,或者根本没有状态…)这是一项任务的一部分,任务是扩展一个已经使用Soap连接到类似web服务的演示,教授们的例子也有同样的问题

我的代码如下:

xmlHttpObj.open("POST", "http://wsf.cdyne.com/WeatherWS/Weather.asmx", true);
xmlHttpObj.setRequestHeader("Content-Type", "text/xml");
xmlHttpObj.setRequestHeader("SOAPAction", "http://ws.cdyne.com/WeatherWS/GetCityForecastByZIP");

var envelope = '<?xml version="1.0" encoding="utf-8"?> \n' +
               '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
               ' xmlns:xsd="http://www.w3.org/2001/XMLSchema"' +
               ' xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' +
               '   <soap:Body> \n' +
               '       <GetCityForecastByZIP xmlns="http://ws.cdyne.com/WeatherWS/"> \n' +
               '           <ZIP>' + selectedZip + '</ZIP> \n' +
               '       </GetCityForecastByZIP> \n' +
               '   </soap:Body> \n' +
               '</soap:Envelope> ';

xmlHttpObj.onreadystatechange = UseResultsCallBack;
xmlHttpObj.send(envelope);
xmlHttpObj.open(“POST”http://wsf.cdyne.com/WeatherWS/Weather.asmx“,对);
setRequestHeader(“内容类型”,“text/xml”);
setRequestHeader(“SOAPAction”http://ws.cdyne.com/WeatherWS/GetCityForecastByZIP");
变量信封='\n'+
'' +
“\n”+
“\n”+
''+已选择ZIP+'\n'+
“\n”+
“\n”+
' ';
xmlHttpObj.onreadystatechange=UseResultsCallBack;
xmlHttpObj.send(信封);
xmlHttpObj
是有效的xmlHttpRequest对象,
selectedZip
是zipcode。这都是客户端代码,所以可能存在某种跨域问题,但我不认为这是本例中的问题

根据您的评论(其中包括您的问题中未包含的非常重要的信息),您似乎正在尝试执行跨域ajax请求。这是不允许的。只有来自
wsf.cdyne.com
的页面才允许向
wsf.cdyne.com
发出ajax请求。甚至来自
cdyne.com
的页面也被阻止对
wsf.cdyne.com
进行ajax调用,因为浏览器认为它是一个不同的域

有两种解决方法。第一个是现代解决方案:CORS(跨来源资源共享)。这需要
wsf.cdyne.com
网站授予您的页面/站点访问其数据的权限。他们可以通过在HTTP响应中添加
访问控制允许来源
头来实现这一点。没有这个修改,你什么都做不了。通过这种修改,您不需要做任何特殊的事情,只需进行常规的ajax调用,浏览器就会与他们的站点进行协商。我再次强调,这不是你需要做的事情。这是
wsf.cdyne.com
管理员需要做的事情。因此,请联系他们的管理员

然而,CORS协议可能对您帮助不大。这是因为大多数浏览器都严格限制您打破同源策略。例如,尽管W3C规范允许
*
源代码,允许每个人对站点发出ajax请求,但出于安全原因,一些浏览器不支持它。此外,尽管可能支持
*
,但某些浏览器不允许本地托管文件(即不在服务器上托管的页面)使用COR。有些甚至更严格地要求服务器拥有域名,而不仅仅是IP地址

有关CORS的更多信息,请参阅以下链接:

  • 第二种解决方法是更传统的方法。阻止您发出请求的是web浏览器。javascript、Perl、PHP、C和Java等编程语言没有这样的限制。因此,解决方案显而易见:不要从浏览器发出请求。将其代理到服务器

    请记住,无论您选择何种语言编写的代理脚本都必须与您的网页托管在同一个域中。同样,这意味着它不能处理本地文件。但是在本地机器上运行一个最小的web服务器应该不会太难

    代理甚至不需要在服务器上。例如,YUI使用Flash小程序代理跨域请求。如果我没弄错的话,你也可以用Java试试。但是Flash和Java最近都开始关闭安全漏洞,所以这种情况可能不会永远持续下去。更不用说供应商开始放弃这两种技术了


    对我来说,最好的办法是简单地运行一个web服务器,并为要向其发出ajax请求的页面编写一个代理脚本。请注意:不要编写通用代理脚本。垃圾邮件发送者和机器人网络运营商一直在寻找开放式网络代理来掩盖他们的踪迹。

    此页面是否托管在
    wsf.cdyne.com
    ?如果没有,那么您就有一个跨域问题(特别是同一来源策略)作为提示:我从来没有在ajax请求中使用过绝对url。始终使用相对url,并让浏览器设置域名。我还用一个健全的脚本来检查这一点。结果是它抓住了试图发出跨域ajax请求的初级程序员。它不是(也不会)托管在任何地方,只是在我的笔记本电脑上运行。通过相对url,您的意思是我应该在请求头中设置主机,然后在open方法中设置相对url吗?我有过类似的东西,但它仍然无法解决任何问题。如果这是一个跨域问题,我将如何解决它?浏览器是否会在通话中使用kabosh?否,在请求头中设置主机将不起作用。该页面必须与ajax请求源所在的域相同,否则它将无法通过同源策略检查。是的,这是一个跨领域的问题。让我把你的选择写在一个答案里。谢谢你的详细回复!出于好奇,如果
    wsf.cdyne.com
    服务器已经安装了COR,那么我发布的代码应该可以正常工作?不幸的是,由于这是一项作业,教授的“正确”答案是在您的浏览器设置中启用跨域数据访问(这样做可以使上述代码完美地工作),并且使用服务器呼叫是额外的学分。是的,默认情况下,除了跨域URL之外,CORS ajax调用和常规ajax调用之间没有区别。浏览器将在一个称为预照明的步骤中为您自动协商。如果您不想预处理,那么需要向ajax r添加一些标题