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>
<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();
}
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;
}
}
{
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>
<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文档。