我有一些非常简单的带有两个按钮的javascript代码。第一个提交一个调用Web服务函数的表单,并在新窗口中打开它。
第二个按钮应该做同样的事情,除了我想将来自Web服务的响应文本放到页面上的div中。
Web服务来自我发现here的示例(您可以在底部的zip文件中下载项目。)
Web服务允许所有来源<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
,因此跨网站脚本应该没有问题。
JavaScript代码(注意:运行Web服务项目时,Visual Studio生成本地主机名)
<head>
<title>Test Web Service Using JavaScript</title>
</head>
<body>
<form action='http://localhost:53276/WebService.asmx/HelloWorld' method="post" target="_blank">
<input type="submit" value="This Works" class="button">
<label> This opens a new window with the result of the web service call</label>
</form>
<input type='submit' id='btnTest' name='btnTest' value="This Doesn't" onclick="WebRequestTest();" >
<label> This should fill the div with the result of the web service call</label>
<div id="MyDiv"></div>
</body></html>
<script language="javascript">
function WebRequestTest() {
function handler() {
//fires when ready state changes
if (this.readyState == 4 ){ //&& request.responseText != '') {
var response = request.responseText;
document.getElementById('MyDiv').innerHTML = response;
return;
}
}
var request = new XMLHttpRequest();
request.onreadystatechange = handler;
request.withCredentials = true;
request.open('POST', 'http://localhost:53276/WebService.asmx/HelloWorld', true); //third optional argument: async (default true)
request.send();
}
</script>
当我点击第一个按钮时,会打开一个新页面,显示XMLHttpRequest
的XML结果。当我点击第二个按钮时,HttpFox告诉我我有一个:
NS_ERROR_DOM_BAD_URI错误
结果只是一个空字符串。
我也尝试了jQuery
,结果相同:
function WebRequestTest2(){
$.ajax({
type: "GET",
url: "http://localhost:53276/WebService.asmx/HelloWorld",
dataType: "xml",
success: function(xml) {
var myString = $(xml).find('string').text();
}
});
}
为了进一步侮辱伤害,上面的JavaScript代码在IE 8中工作正常,但不是我的目标浏览器Firefox 17。
有谁能告诉我如何让Firefox与我的网络服务相处得很好?有人建议我在我的网络服务中可能需要一个CORS库,但这似乎是一个问题,这个问题必须已经内置了已定义的解决方案。
答案 0 :(得分:0)
我在此示例后使用WebAPI CORS功能解决了我的问题:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
此外,我需要覆盖firefox发送的原点,因为它在本地加载文件时为null。我用HttpFox来做这件事。