从普通的html页面调用WCF(在同一个域上)

时间:2017-11-01 22:03:56

标签: javascript ajax wcf

我有一个托管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);

1 个答案:

答案 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>