现在的位置: 首页 > 综合 > 正文

Silverlight跨域调用WCF服务安全问题

2012年12月01日 ⁄ 综合 ⁄ 共 2414字 ⁄ 字号 评论关闭

     silverlight是一种客户端技术,所以不能直接与数据源打交道,通常情况下,都是通过中转来实现的,比如WCF,WebClient,Web Request等等方法,通常,在silverlight在调用wcf服务时,会经常出现所谓的跨域安全问题,

    这个跨域解释是:wcf提供的访问地址是http:/localhost:1642/,而silverlight运行的端口不一致,比如是http://localhost:1500/,就不是在一个域中,出现跨域访问的问题,因为默认情况下,wcf不是不允许在提供web跨域。

silverlight sdk中提供一种解决方法就是在wcf的根路径加入一个ClientAccessPolicy.xml文件

 

<?xml version="1.0" encoding="utf-8"?> 
<access-policy> 
<cross-domain-access> 
 
<policy> 
 
<allow-from> 
 
<domain uri="*"/> 
 
</allow-from> 
<grant-to> 
 
<resource path="/" include-subpaths="true"/> 
</grant-to> 
 
</policy> 
</cross-domain-access> 
</access-policy>

另外,必须要把这个作为一种服务提供,具体怎么作为服务提供,我google了一下,新添加一个服务,服务接口如下:

 

[ServiceContract]
    
public interface IcrossDomainService
    {
        [OperationContract]
        [WebGet(UriTemplate 
= "ClientAccessPolicy.xml")]
        Message ProvidePolicyFile();

    }

再添加一个具体的服务.svc文件:

 

public class CrossDomainService : IcrossDomainService
    {

        public System.ServiceModel.Channels.Message ProvidePolicyFile()
        {

            FileStream filestream = File.Open(@"ClientAccessPolicy.xml", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);//此处访问xml地址
            XmlReader reader = XmlReader.Create(filestream);

            System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);
            System.Console.WriteLine(
"it start...");
            
return result;

        }
    }

最后要更改服务配置文件:App.config

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <!-- 部署服务库项目时,必须将配置文件的内容添加到
  主机的 app.config 文件中。System.Configuration 不支持库的配置文件。
-->
 
<system.serviceModel>
  
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  
<behaviors>
   
<endpointBehaviors>
    
<behavior. name="CrossDomainService.CrossDomainServiceBehavior">
     
<webHttp />
    
</behavior>
   
</endpointBehaviors>
   
<serviceBehaviors></serviceBehaviors>
  
</behaviors>
  
<services>
   
<service name="CrossDomainService.CrossDomainService">
    
<endpoint address="" behaviorConfiguration="CrossDomainService.CrossDomainServiceBehavior"
       binding
="webHttpBinding" contract="CrossDomainService.IcrossDomainService" />
    
<host>
     
<baseAddresses>
      
<add baseAddress="http://localhost:1642/" /><!---baseAddress地址就是希望提供跨域访问的地址-->
     
</baseAddresses>
    
</host>
   
</service>
  
</services>
 
</system.serviceModel>
</configuration>

最后把这个服务添加到wcf服务中,那么域http://localhost:1642/就可以提供跨域访问了。检查是否成功,就是浏览http://localhost:1642/ClientAcessPolicy.xml,看是否可以看到xml文档。

抱歉!评论已关闭.