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

     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文档。

你可能感兴趣的:(silverlight)