Silverlight跨域消费WCF服务安全问题解决方法(转)

这是一个老问题了,我也遇到了,就是wcf提供服务,Silverlight前段去消费服务。如果wcf提供的address比如是http:/localhost:8839/,而silverlight运行的端口不一致,比如是http://localhost:7777/,就不是在一个域中,出现跨域访问的问题。wcf默认在提供Web跨域是安全阻塞的。

网上查了一下,主要是解决方法是在wcf的根路径加入一个ClientAcessPolicy.xml。该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>

但是,加入并没有效果,网上查了一下,是要把这个作为服务提供,后来根据Wxwinter的例子,该例子可以google到,添加了一个服务,解决了这个问题。

这个服务的服务接口是这样的

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

    }

具体服务是:

 public class crossDomainService : IcrossDomainService
    {

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

           FileStream filestream = File.Open(@"跨域访问\ClientAcessPolicy.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配置默认问

<?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:7656/" />

<!---baseAddress地址就是希望提供跨域访问的地址-->
     </baseAddresses>
    </host>
   </service>

  </services>
 </system.serviceModel>
</configuration>

把这个作为服务添加到wcf服务中,那么域http://localhost:7656/就可以提供跨域访问了。

检查是否成功,就是浏览http://localhost:7656/ClientAcessPolicy.xml,看是否可以看到xml文档。

源代码在附件中crossDomainService.gif改为crossDomainService.rar即可,应该可以更改使用。

http://space.itpub.net/22259926/viewspace-627039#xspace-itemreply

posted @ 2010-10-29 15:54  董雨  阅读(234)  评论(0编辑  收藏  举报