我有一个托管WCF服务的Windows服务。
我的小型测试程序(Windows控制台)可以很好地调用此WCf(该服务只返回日期和时间)。
但我无法让它在我的index.html页面上运行!为什么?
一切都在我的机器上运行。不涉及网络服务器。
这是index.html文件:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>TEST</title></head>
<script Language="JavaScript">
function test() {
var url = 'http://localhost:80/TestService'
var xhr = new XMLHttpRequest();
xhr.open('GET', url+'/GetCurrentDateTime');
xhr.onload = function() {
if (xhr.status === 200) {
alert('Response=' + xhr.responseText);
}
else {
alert('Request failed. Returned status=' + xhr.status);
}
};
xhr.send();
}
</script>
<body>
<div>
<input id="Button1" type="button" value="button" onclick="test()"/>
</div>
</body>
</html>
当我在Chrome中打开文件并按下按钮时出现此错误:
index.html:24 GET http://localhost/TestService/GetCurrentDateTime 404(未找到) test @ index.html:24 onclick @ index.html:8 index.html:1无法加载http://localhost/TestService/GetCurrentDateTime:否&#39; Access-Control-Allow-Origin&#39;标头出现在请求的资源上。起源&#39; null&#39;因此不允许访问。响应的HTTP状态代码为404.
以下是控制台如何托管WCf服务:
Uri uri = new Uri("http://localhost:80/TestService");
_serviceHost = new ServiceHost(typeof(CommonService), uri);
_serviceHost.Open();
以下是我的测试程序调用它的方法(这很好用):
Uri uri = new Uri("http://localhost:80/TestService");
var binding = GetDefaultHttpBinding();
var factory = new ChannelFactory<ICommonContract>(binding, new EndpointAddress(uri));
ICommonContract service = factory.CreateChannel();
// Call WCF service - this works fine
var dateTime = service.GetCurrentDateTime();
Console.WriteLine("Datetime: {0}", dateTime);
答案 0 :(得分:0)
一切都在我的机器上运行。不涉及网络服务器。
你错了我的朋友,网址http://localhost:80/TestService 创建对Web服务器的HTTP请求。 404(未找到)测试:因为您的body标记的结尾必须在脚本标记之后。
</div>
<script Language="JavaScript">
//rest of script here
</script>
</body>
</html>
无法加载http://localhost/TestService/GetCurrentDateTime:请求的资源上没有“Access-Control-Allow-Origin”标头。因此,不允许原点'null'访问。
跨源资源共享(CORS)是一种机制,它使用其他HTTP标头让用户代理获得从与当前使用的站点不同的源(域)上的服务器访问所选资源的权限。 出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。 要解决此问题,您必须告诉浏览器或授予访问跨源域资源但装饰Web的权限。具有以下配置的配置文件。
<system.webServer>
<httpProtocol>
<customHeaders>
<!-- Enable Cross Domain AJAX calls -->
<remove name="Access-Control-Allow-Origin" />
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>