(转)Silverlight跨域访问WCF
关于这个问题,我前后忙活了一个星期,总算把它搞定了,其中遇到很多错误,在此记录以便后续不犯同样的错误。
我在做的时候,是创建的一个WCF服务库,这个服务库里面包含app.config 和其他服务的接口文件和实现文件(ITestService.cs 和 TestService.cs),创建好之后将这个,将此项目发布,发布到一个文件夹或者直接发布到网站中(前提是你已经为该服务创建了站点)。发布后的文件中包含了.svc文件,在其他地方引用的也就是这个文件,其中.svc文件会以服务实现类命名(如上述两个文件发布后的WCF服务文件名就是TestService.svc)。发布时可能遇到以下问题
问题一:跨域支持
WCF发布到IIS中,必须以站点的方式,不能在默认网站中添加虚拟目录,如果涉及到跨域访问的话,访问绝对不成功。其中需要两个文件clientaccesspolicy.xml 和 crossdomain.xml,这两个文件必须放在站点的根目录下,具体内容如下:
clientaccesspolicy.xml
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
crossdomain.xml
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM>
<cross-domain-policy>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
如果这个文件没配置对,就会在调试程序时出现恼人的“跨域不支持错误”!
问题二:IIS站点配置
其中有几个需要注意的地方,一是FrameWork的版本必须选择为2.0。二是设为可以匿名访问。
搭建环境的时候,应该先安装IIS,再安装VS,这样会把Framework 2.0集成到IIS中,如果先安装了vs,后安装IIS,则需要在命令行中去注册Framework2.0到IIS。打开VS的命令提示行,输入:aspnet_regiis.exe -i。如果不出现错误会提示安装成功。
上述IIS如果没有正确安装好, 在浏览.svc文件时会提示无法显示该页或文件未找到的错误。
问题三:外部引用不成功。
我在练习的时候出现这样一个问题,能够找到服务,但是引用不成功,最后知道是本机与另一台机器的IP地址设置不一样,其中,必须将两台机器的IP地址设在同一个网段,包括默认网关和子网掩码。设置好之后使用ping命令,检测能否ping通另外一台机器的IP地址和主机名。因为在添加服务引用的时候,vs会将对方IP转换为主机名(外网未测试过,不知道情况是不是一样)。如果没有设置好IP地址,则会提示无法解析主机名,继而引用失败。
问题四:引用成功,但是运行时网页提示500错误。
这是MS的一个bug,如何解决这个错误,可以查看http://www.imwls.com/的文章“IIS 500错误解决方案,绝对有效”。这个问题多出在XP系统上,同时我也通过文章介绍的配置方法得到解决。
我在做的时候,是创建的一个WCF服务库,这个服务库里面包含app.config 和其他服务的接口文件和实现文件(ITestService.cs 和 TestService.cs),创建好之后将这个,将此项目发布,发布到一个文件夹或者直接发布到网站中(前提是你已经为该服务创建了站点)。发布后的文件中包含了.svc文件,在其他地方引用的也就是这个文件,其中.svc文件会以服务实现类命名(如上述两个文件发布后的WCF服务文件名就是TestService.svc)。发布时可能遇到以下问题
问题一:跨域支持
WCF发布到IIS中,必须以站点的方式,不能在默认网站中添加虚拟目录,
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
<!DOCTYPE cross-domain-policy SYSTEM>
<cross-domain-policy>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
如果这个文件没配置对,就会在调试程序时出现恼人的“跨域不支持错误”!
问题二:IIS站点配置
其中有几个需要注意的地方,一是FrameWork的版本必须选择为2.0。二是设为可以匿名访问。
搭建环境的时候,应该先安装IIS,再安装VS,这样会把Framework 2.0集成到IIS中,如果先安装了vs,后安装IIS,则需要在命令行中去注册Framework2.0到IIS。打开VS的命令提示行,输入:aspnet_regiis.exe -i。如果不出现错误会提示安装成功。
上述IIS如果没有正确安装好, 在浏览.svc文件时会提示无法显示该页或文件未找到的错误。
问题三:外部引用不成功。
我在练习的时候出现这样一个问题,能够找到服务,但是引用不成功,最后知道是本机与另一台机器的IP地址设置不一样,其中,必须将两台机器的IP地址设在同一个网段,包括默认网关和子网掩码。设置好之后使用ping命令,检测能否ping通另外一台机器的IP地址和主机名。因为在添加服务引用的时候,vs会将对方IP转换为主机名(外网未测试过,不知道情况是不是一样)。如果没有设置好IP地址,则会提示无法解析主机名,继而引用失败。
问题四:引用成功,但是运行时网页提示500错误。
这是MS的一个bug,如何解决这个错误,可以查看http://www.imwls.com/