zoukankan      html  css  js  c++  java
  • 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文档。

  • 相关阅读:
    spring mvc ajax请求
    spring mvc 返回页面数据
    spring mvc 参数传递的三种方式
    spring mvc 注解示例
    spring mvc handler的三种方式
    MyBatis 一级、二级缓存
    MyBatis 调用存储过程
    MyBatis动态SQL与模糊查询
    spring mvc 注解入门示例
    MyBatis 一对多关联查询
  • 原文地址:https://www.cnblogs.com/repository/p/1791406.html
Copyright © 2011-2022 走看看