Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jQuery AJAX基于SOAP的web服务和CORS(跨源资源共享)_Jquery_Web Services_Soap_Cors - Fatal编程技术网

jQuery AJAX基于SOAP的web服务和CORS(跨源资源共享)

jQuery AJAX基于SOAP的web服务和CORS(跨源资源共享),jquery,web-services,soap,cors,Jquery,Web Services,Soap,Cors,几周来,我一直在尝试使用我为一位客户编写的jQuery插件,让我的一个基于jQuery AJAX SOAP的跨域web服务工作。 我做的大多数研究似乎都表明这是不可能的,因为CORS或跨源资源共享只允许jasonP(GET)类型的调用 我终于想到了如何让它发挥作用,并想与大家分享我必须做的事情。 首先要了解的是,在支持CORS的浏览器中,服务器位于另一个域中,GET(以及其他参数)将导致所谓的飞行前检查。这意味着浏览器将要求服务器提供允许其执行的选项列表。 除非服务器返回允许基于SOAP的web

几周来,我一直在尝试使用我为一位客户编写的jQuery插件,让我的一个基于jQuery AJAX SOAP的跨域web服务工作。 我做的大多数研究似乎都表明这是不可能的,因为CORS或跨源资源共享只允许jasonP(GET)类型的调用

我终于想到了如何让它发挥作用,并想与大家分享我必须做的事情。

首先要了解的是,在支持CORS的浏览器中,服务器位于另一个域中,GET(以及其他参数)将导致所谓的飞行前检查。这意味着浏览器将要求服务器提供允许其执行的选项列表。 除非服务器返回允许基于SOAP的web服务的选项的确切列表,否则调用将在发出实际请求之前失败

您需要做的是使web服务器(在我的示例中是IIS7.5)返回正确的选项列表。
您可以通过在inetpub\wwwroot文件夹中配置web.config文件来实现这一点(如果您没有web.config文件,只需创建它并将以下内容复制到其中)

我的web.config文件如下所示

重要每件事都是区分大小写的一旦我意识到这一点,每件事都能如期工作

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <system.webServer>
  <httpProtocol>
   <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS, PUT, DELETE" />
    <add name="Access-Control-Allow-Headers" value="content-type,soapaction,x-requested-with" />      
    </customHeaders>
   </httpProtocol>
        <handlers accessPolicy="Read, Execute, Script" />
 </system.webServer>
</configuration>

我的jQueryAjax代码如下所示

var getNextJobId = function()
{
  var se = '';
  se = se + '<?xml version="1.0" encoding="UTF-8" standalone="no"?>';
  se = se + '<soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope">';
  se = se + '<soap-env:Body>';
  se = se + '<ebas:getNextJobIdRequest xmlns:ebas="http://www.ebasetech.com">';
  se = se + '<ebas:ORGCODE>' + plugin.settings.orgcode + '</ebas:ORGCODE>';
  se = se + '</ebas:getNextJobIdRequest>';
  se = se + '</soap-env:Body>';
  se = se + '</soap-env:Envelope>';
  $.ajax(
  {
    url: params.webserviceTargetUrl,
beforeSend: function(xhr)
{
  xhr.setRequestHeader("SOAPAction", "getNextJobId");
},
type: "POST",
dataType: "xml",
data: se,
crossDomain: true,
headers: {"X-Requested-With": "XMLHttpRequest"},
async: false,
success: function(xml)
{
  params.jobId =   $(xml).find("ebas\:JOBID").text();
},
failure: function(xml)
{
  params.webserviceFailure = $(xml).text();
},
      contentType: "charset=UTF-8"
});
}
var getNextJobId=function()
{
var-se='';
se=se+“”;
se=se+“”;
se=se+“”;
se=se+“”;
se=se+''+plugin.settings.orgcode+'';
se=se+“”;
se=se+“”;
se=se+“”;
$.ajax(
{
url:params.webserviceTargetUrl,
发送前:函数(xhr)
{
setRequestHeader(“SOAPAction”、“getNextJobId”);
},
类型:“POST”,
数据类型:“xml”,
资料来源:东南欧,
跨域:是的,
标题:{“X-request-With”:“XMLHttpRequest”},
async:false,
成功:函数(xml)
{
params.jobId=$(xml).find(“ebas \:jobId”).text();
},
失败:函数(xml)
{
params.webserviceFailure=$(xml.text();
},
contentType:“字符集=UTF-8”
});
}
“这是不可能的,因为CORS或跨源资源共享只允许jasonP(GET)类型的调用。”

CORS不仅限于GET方法,也不限于JSONP风格的调用

JSONP是web开发人员在CORS标准化之前使用的一种技术,用于对服务于页面的主机以外的主机执行AJAX请求。JSONP的工作原理是在页面中插入
标记。它需要服务器参与,通常是通过将JSON结果包装在对函数的调用中,该函数在AJAX调用中通过
回调
参数命名。请参阅以下答案:

正如您所指出的,JSONP仅限于执行GET方法,因为
只执行GET。它还有其他问题,例如无法处理错误。例如,如果返回400响应,则浏览器不会执行脚本,而不会为AJAX调用执行JS错误处理程序


CORS是一个较新的标准。它还需要服务器参与,因为它必须处理飞行前检查,并使用额外的HTTP头,如:
Access Control Allow Origin
Access Control Allow Methods
、以及
Access Control Allow headers
,您在问题编辑中详细描述了这些头。它不仅限于获取方法。相反,它仅限于
Access Control Allow methods
标题中飞行前检查结果指定的方法。CORS不需要在回调函数中包装结果或对结果进行任何其他调整,它可以处理错误和其他状态代码。有关更多信息,请参阅此篇文章。

将jquery中SOAP的
failure
更改为
error
+1此问题似乎脱离主题,因为它不符合我们的要求。考虑把答案和问题分开。这里有一些好的附加信息和链接。谢谢你们两位。