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>
<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文档。
Author:repository
From: http://repository.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
From: http://repository.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类:
silverlight
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述