Sileverlight很多时候需要通过wcf和后台,程序进行交互。如果 iis was托管还好,极端的遇到自托管的程序,console,windowsservice,winform,wpf等,就会出现跨域问题。网上很多解决方式。俺在以下博文基础上又总结了点。

  以下博文可以先学习下:

    http://blog.csdn.net/boyhxy/article/details/5224112

    http://blog.sina.com.cn/s/blog_74066ace0100vhs5.html

    http://www.cnblogs.com/lxblog/archive/2012/08/02/2620393.html


以下是个人总结

     1.此解决方案与Silverlight版本无关。

     2.可以跨进程托管Domain

     3.可以不写配置文件托管Domain和Service

     4.可以用 Stream和Message当Domain返回值

     5.不通过配置实现的自托管代码如下:


跨域解决方案

     方案1:

  1.在项目中加入clientaccesspolicy.xml,编译生成内容,复制=true

<?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>

      2. 加入域提供类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Activation;
using System.ServiceModel.Channels;
using System.Xml;
namespace TEST
{
public class DomainService : IDomainService
{
public System.ServiceModel.Channels.Message ProvidePolicyFile()
{
XmlReader reader = XmlReader.Create("clientaccesspolicy.xml");
System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);
return result;
} } [ServiceContract] public interface IDomainService
{
[OperationContract]
[WebGet(UriTemplate = "/clientaccesspolicy.xml")]
System.ServiceModel.Channels.Message ProvidePolicyFile();
}
}

     3.自托管 启动跨域访问

           //启动跨域访问
ServiceHost crossDomainserviceHost = new ServiceHost(typeof(DomainService));
crossDomainserviceHost.AddServiceEndpoint(typeof(IDomainService), new WebHttpBinding()
, "http://127.0.0.1:4514/"); crossDomainserviceHost.Description.Endpoints[].Behaviors.Add(new WebHttpBehavior());
crossDomainserviceHost.Open();

注:

            优点:跨域访问的返回文件类型是:Content-Type: application/xml 。IE,Chrome都测试过,都可以使用。

            缺点:客户端过多可能对造成过多的IO请求,需要做多客户端压力测试。


  方案2:

   1.在项目中加入clientaccesspolicy.xml,编译生成嵌入资源

    2.加入域提供类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Activation;
using System.ServiceModel.Channels;
using System.Xml;
namespace Test
{
public class DomainService : IDomainService
{
public Stream ProvidePolicyFile()
{ var policyfile = "Test.clientaccesspolicy.xml";
Stream result= Assembly.GetExecutingAssembly().GetManifestResourceStream(policyfile);

return result;
}
} [ServiceContract] public interface IDomainService
{
[OperationContract]
[WebGet(UriTemplate = "/clientaccesspolicy.xml")]
Stream ProvidePolicyFile(); }
}

     3.自托管 启动跨域访问

 注:

            优点:没有过多的IO请求。

            缺点:跨域访问的返回文件类型是:Content-Type: application/octet-stream 。IE可用,Chrome不可用。


     方案3:

         1.加入域提供类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Activation;
using System.ServiceModel.Channels;
using System.Xml;
namespace TEST
{
public class DomainService : IDomainService
{
public Stream ProvidePolicyFile()
{
string clientAccessPolicy = "<?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>";
return StringToStream(clientAccessPolicy);
} private Stream StringToStream(string result)
{
WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml"; return new MemoryStream(Encoding.UTF8.GetBytes(result));
} } [ServiceContract] public interface IDomainService
{
[OperationContract]
[WebGet(UriTemplate = "/clientaccesspolicy.xml")]
Stream ProvidePolicyFile(); }
}

     3.自托管 启动跨域访问

 注:

            优点:没有过多的IO请求。跨域访问的返回文件类型是Content-Type: application/xml。IE,Chrome可用

            缺点:指定了编码方式,可能带来局限性。

   


总结:

              方案3,1一般情况均较好。个人喜欢第3种。


      --Domain--
  ServiceHost crossDomainserviceHost = new ServiceHost(typeof(DomainService));
  crossDomainserviceHost.AddServiceEndpoint(typeof(IDomainService), new WebHttpBinding()
     , "http://localhost:9090/");

  crossDomainserviceHost.Description.Endpoints[0].Behaviors.Add(new WebHttpBehavior());
  crossDomainserviceHost.Open();

  --Service--

  ServiceHost testHost = new ServiceHost(typeof(WCFService), new Uri("http://localhost:9090/WCFService/"));
  testHost.AddServiceEndpoint(typeof(IWCFService), new BasicHttpBinding()
    , "");

  ServiceMetadataBehavior bb = new ServiceMetadataBehavior();
  bb.HttpGetEnabled = true;
  bb.HttpGetUrl = new Uri("http://localhost:9090/WCFService/mex");
  testHost.Description.Behaviors.Add(bb);

  ServiceCredentials credential = new ServiceCredentials();
  testHost.Description.Behaviors.Add(credential);

  testHost.Open();

    注意:请用“http://localhost:9090/WCFService/mex”来寻找服务,目前水平有限,还不能直接通过代码实现和配置一样通过http://localhost:9090/WCFService/"来寻找服务。望大家知道的能回复答案。

 

Silverlight 调用自托管的wcf 报跨域异常的处理的更多相关文章

  1. chrome,opera..通过file协议浏览html代码时,发送的ajax请求本地文件,会报跨域错误

    XMLHttpRequest cannot loadfile:///E:/webs/extJS/ext-3.3.0/examples/csdn/combobox.txt?_dc=14147389739 ...

  2. Silverlight+WCF实现跨域调用

    在这篇文章中.WCF扮演server,向外提供LoginVaild服务.Silverlight扮演client.调用WCF提供的LoginVaild服务.思路有了.以下进行代码实现. 数据库脚本实现 ...

  3. 关于C#调用非托管DLL,报“内存已损坏的”坑,坑,坑

    因客户需求,与第三方对接,调用非托管DLL,之前正常对接的程序,却总是报“内存已损坏的异常”,程序进程直接死掉,折腾到这个点(2018-05-11 00:26),终于尘埃落定,直接上程序. 之前的程序 ...

  4. springboot 服务工程,前端服务调用接口报跨域错误

    前后端分离,VUE.JS调用服务接口时,跨域错误.需要服务接口工程设置,如下: @SpringBootApplicationpublic class SpringCloudOpenapiApplica ...

  5. 前端页面调用Spring boot接口发生的跨域问题

    最近要重构一个基于spring boot的后端API服务,需要再本地测试.在本地测试时,运行在本地的前端页面发送一个ajax请求访问后端API,然后浏览器报错blocked CORS policy. ...

  6. fetch各种报跨域错误,数据无法获取的解决方案

    1.介绍 fetch 提供了一个获取资源的接口 (包括跨域). fetch 的核心主要包括:Request , Response , Header , Body 利用了请求的异步特性 --- 它是基于 ...

  7. 跨域解决方案之JSONP,通过借助调用百度搜索的API了解跨域案例

    跨域解决方案之JSONP 同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web ...

  8. wcf项目跨域问题处理

    最近做了一个wcf项目,请求发起的项目是一个webform项目,所以这是分开的两个项目端口必然不一样,理所当然存在跨域问题. 有的人当下就反应过来jsonp,jsonp只能用于get请求,对于参数比较 ...

  9. WCF ajax跨域配置

    webconfig必须配置 binding="webHttpBinding" <service name="Hezi.MsgService.Send"&g ...

随机推荐

  1. MacOS下如何进行Git的冲突(Conflict)处理

    Git在做merge时经常碰到冲突的问题,多数情况都是用IDE中集成的"解决冲突"工具解决了,但有时不能依赖IDE时,就得回过头来去搞清楚Git的一些基础操作了. mergetoo ...

  2. 解决 com.sun.*包导入错误

    解决 com.sun.*包导入错误 com.sun.image.codec.jpeg.*导入错误如何解决: com.sun.*是受限制访问的API,Eclipse 默认把受访问限制的API设成了ERR ...

  3. a标签,img标签,表格

    <a></a>    a标签,超链接标签 ,引入超链接方式:  src="...."   target="blank" 打开方式--新页 ...

  4. spring3.0结合Redis在项目中的运用

    推荐一个程序员的论坛网站:http://ourcoders.com/home/ 以下内容使用到的技术有:Redis缓存.SpringMVC.Maven.项目中使用了redis缓存,目的是在业务场景中, ...

  5. Scalaz(25)- Monad: Monad Transformer-叠加Monad效果

    中间插播了几篇scalaz数据类型,现在又要回到Monad专题.因为FP的特征就是Monad式编程(Monadic programming),所以必须充分理解认识Monad.熟练掌握Monad运用.曾 ...

  6. GJM : 【C# 高性能服务器】完成端口、心跳的高性能Socket服务器 [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  7. GJM :JS + CSS3 打造炫酷3D相册 [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  8. Spring MVC处理异常的4种方式

    http://blog.csdn.net/ufo2910628/article/details/40399539 http://my.oschina.net/CandyDesire/blog/3333 ...

  9. 使用Yeoman快速启动AngularJS项目开发

    本博客停止更新,请访问新个人博客:owenchen.net 前言 博客迁移到了BAE上,http://owenchen.net/,以后的文章会首发在自己的博客上,随后在博客园发布. 很久没有写文章了, ...

  10. 图解.NET Stack和Heap的本质区别

    现在越来越觉得对.NET基本概念的理解和掌握对于提升编程水平的重要性,先从.NET的 Stack(栈)和Heap(堆)说起,计算机的内存可以分为代码块内存,stack内存和heap内存.代码块内存是在 ...