Silverlight访问webService跨域问题的解决之一

调试清单
     检查服务是否正在运行

     检查配置

     检查跨域问题

     检查是否已启用异常

     检查网络上的内容

检查服务是否正在运行
在 Silverlight 客户端上查找问题之前,请确认正在访问的服务正常运行。对此进行检查的一种方法是将服务地址键入 Web 浏览器。此处所需的服务地址是 ServiceReferences.ClientConfig 文件的 <endpoint> 元素中的 address 属性的值。请注意,这不是键入到“添加服务引用”对话框中的地址。“服务帮助页”功能经常可用,输入地址后将显示一个页面,指示服务是否正常运行。如果 “服务帮助页”无法显示,则错误页将指示服务是否正常运行,并且会提供一个可用作调试起点的消息。

通常,测试服务是否运行的更可靠的一种方法是使用测试工具尝试与服务进行对话(如 WCF 测试客户端)。

查明是否是服务代码而不是 Silverlight 客户端代码出现问题的另一种非常可靠但有时开销较大的方法是,尝试从非 Silverlight 客户端使用服务。例如,创建新的控制台应用程序类型项目,像在 Silverlight 项目中一样对该项目执行“添加服务引用”,然后再次将服务使用代码添加到
Main()
内,就像在 Silverlight 应用程序中一样。使用
Console.WriteLine
显示结果。

检查配置
第一步是检查 Silverlight 客户端是否配置正确。您应该有一个名为 ServiceReferences.ClientConfig 的文件,该文件由“添加服务引用”工具生成。检查正在使用 IService 协定访问相关服务的 CustomerService 客户端的文件。生成的配置文件应如以下内容所示。

复制代码
<configuration>
<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding
         name="BasicHttpBinding_IService"
         maxBufferSize="65536"
         maxReceivedMessageSize="65536">
         <security mode="None" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
       <endpoint
        address="http://localhost:61424/WebSite5/Service.svc "
        binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IService"
        contract="CustomerClient.CustomerService.IService"
        name="BasicHttpBinding_Service" />
    </client>
</system.serviceModel>
</configuration>
请注意,您添加对其引用的服务只有一个 <endpoint> 元素,并且在 Silverlight 应用程序正确配置的情况下绑定为 basicHttpBinding 绑定。

如果服务中没有 <endpoint> 元素,则您的服务可能实际上配置不正确,无法被 Silverlight 2.0 应用程序访问。Silverlight 2.0 应用程序只能与使用 SOAP 1.1 的简单 SOAP 服务对话,无法处理任何高级的 WS-* 协议,如 WS-Addressing 或 WS-Security。如果使用 ASP.NET Web 服务,则客户端应仅默认使用此简单配置。有关 ServiceReferences.ClientConfig 文件中的设置,请参阅在 Silverlight 客户端中配置 Web 服务使用。

如果使用的是服务的 WCF 技术,则应该检查客户端上的配置,即使客户端 ServiceReferences.ClientConfig 看似正确。从服务中打开 Web.config 文件并查找 <system.serviceModel> 元素。

复制代码
<system.serviceModel>
...
   <services>
      <service name="MyProject.Service">
         <endpoint
            address=""
            binding="basicHttpBinding"
            contract="MyProject.IService" />
         <endpoint
            address="mex"
            binding="mexHttpBinding"
            contract="IMetadataExchange" />
      </service>
   </services>
</system.serviceModel>
查找其协定属性引用了 Silverlight 2.0 客户端正在访问的服务的 <endpoint> 元素。确保 binding 属性的值已设置为“basicHttpBinding”。其他 <endpoint> 元素可用于具有其他绑定的其他协定。例如在前面的示例中,"mex" 终结点用于为服务提供元数据。 有关 配置服务,请参阅使用配置文件配置服务。

检查跨域问题(承载服务必须和webservice在一个服务器上)
有几个与 Silverlight 应用程序相关的 URL,区分这些 URL 对于构建可能出现的跨域问题的讨论非常重要。启动应用程序时,出现在浏览器中的 URL 称为“应用程序 URL”。此 URL 通常类似如下显示:http://localhost:1111/something/MyGraphicalApp.aspx 。请注意,此处真正重要的是 XAP 文件的 URL,在此例中可能显示为 http://localhost:1111/somethingelse/MyGraphicalApp.xap ,但在大多数较简单的情况下,此 URL 与承载的网页将处于相同的域中,因此可以忽略此区别。然后,查看 ServiceReferences.ClientConfig 文件中的“服务 URL”:例如 http://localhost:5678/somepath/TestService.svc 和 local.live.com/SearchService/LocalSearch.asmx。

导致跨域问题的一个常见错误是从 file:// 应用程序 URL 运行 Silverlight 应用程序。在 Visual Studio 2008 中使用 F5 功能运行 Silverlight 应用程序时,也可能会遇到此问题。若要避免此问题,请右键单击项目中的 .aspx 页并选择“在浏览器中查看”。

若要了解跨域问题,请务必了解 URL 的哪个部分指定域。域基本上是介于 http:// 和 URL 中接下来出现的第一个斜杠 / 之间的部分。其中包括端口号(如果未明确指定,则假设使用 80)等。如果应用程序 URL 的域不同于服务 URL 的域,则表明为跨域情形。甚至端口号或域名的一个部分不同 ,都会导致此类问题的出现。例如,您的应用程序位于 http://localhost:1111/something/MyGraphicalApp.aspx ,它尝试调入 http://localhost:5678/somepath/TestService.svc ,则出现跨域情形,因为 localhost:1111 是与 localhost:5678 不同的域。

跨域访问服务要求服务具有跨域策略文件。有以下两种跨域策略文件:Clientaccesspolicy.xml 和 Crossdomain.xml(放在根目录)。 如果希望服务跨域运行,则必须存在其中之一。有关更多信息,请参见 使服务跨域边界可用。

有一种简便的方法可检查是否已为跨域访问正确设置服务。打开浏览器并浏览至 http://service_domain/clientaccesspolicy.xml ,然后浏览至 http://service_domain/crossdomain.xml 。如果存在其中之一,有效且已配置为允许跨域访问,则可以跨域访问服务。

一个常见错误是将跨域策略文件放在不是域根目录的某个位置:例如将 Clientaccesspolicy.xml 文件放在 http://localhost:5678/somepath/clientaccesspolicy.xml 而不是 http://localhost:5678/clientaccesspolicy.xml 。处理较旧的(比如 .NET Framework 2.0)项目时,很容易遇到这种情形。

同时,请确保检查这些文件的语法。分析其中一个文件时出现错误将视为该文件不存在。请注意,Clientaccesspolicy.xml 和 Crossdomain.xml 文件使用不同的语法。确保为选择使用的文件类型使用适当的内容。

检查是否已启用异常
通常,Silverlight 生成的异常消息中不会提供太多的信息。详细的异常信息需要大量的空间,尤其是在需要将其转换为 Silverlight 支持的所有语言时。因此,不包括详细信息是为了使 Silverlight 下载尽可能小而在设计时作出的决定。有关如何修改 Silverlight 2.0 清单文件以启用完整异常的说明,请参阅 Silverlight 2.0 发行说明。

而且,如果访问 WCF 服务,通常不会返回服务器上所引发异常的太多信息。这是一种安全措施:通常不希望将有关服务的内部信息暴露给外界(如何查看WCF异常详情查看本博客WebService异常封装 http://hi.baidu.com/evaandlean/blog/item/3b913012663286d8f7039ef9.html )。

在任何情况下(通常是在 Web 服务方案中),有用的异常信息都包含于若干外部层异常包装的 innerException 中。因此在获得一个异常时,不要仅查看异常本身。还要查看嵌套的
innerException
的所有层次结构,以提取有关问题来源的尽可能多的信息。


检查网络上的内容
调试 Silverlight 服务使用问题的最根本的方法是使用“HTTP 侦察”工具,如 http://www.fiddlertool.com/fiddler/http://projects.nikhilk.net/webdevhelper/ 。这些工具将显示发生的实际 HTTP 流量。在使用该工具之前,请确保先在服务器上启用异常,如上节所述。

同时启动 Silverlight 应用程序和工具,然后让应用程序调用 Web 服务。下面是您可能会看到的一些常见模式:

1. 无:您的 HTTP 侦察工具可能配置不正确。尝试运行另一个非 Silverlight 应用程序(如一般 Web 浏览器),以确保该工具运行正常。或者,您的应用程序可能已损坏。在调用服务的位置放一个断点,以确保实际调用了服务。您可能还存在配置问题,在这种情况 下应参考前面的配置一节。您可能会尝试从 file:// 或 https:// URL 承载应用程序,或者尝试调用 https:// 服务。

2. 仅服务请求:如果您的网络上看到对服务的实际请求,则您已经避免了跨域情形。确定该地址是否为预期的地址。查看网络上返回的内容。内容是否已超时,或者遇 到 404 错误?您的服务或甚至 WCF 本身可能设置不正确。是否返回了 SOAP 错误?如果是,请仔细阅读错误中的内容,通常其中包含了用于调试该问题的足够信息。一般情况下,请仔细查看请求和回复,包括正文和 HTTP 标头。是否已删除任何内容以便让代理通过编译?服务实际上可能要求使用删除的某些项。例如,它可能要求使用某些 SOAP 标头。

3. 先请求 Clientaccesspolicy.xml(之后可能是 Crossdomain.xml),然后请求服务:您存在跨域情形,但是已成功设置跨域策略文件。现在,这种情形和模式 2 基本相同。

4. 仅请求 Clientaccesspolicy.xml,无其他:很大程度上这是因为 Clientaccesspolicy.xml 格式不正确,或者它包含禁止跨域访问的策略。

5. 请求 Clientaccesspolicy.xml,然后请求 Crossdomain.xml,无其他:基本上,很可能是跨域策略文件出现问题。是否收到 404 错误?请检查是否以正确的方式承载文件以及是否在正确的位置。是否实际收到了文件?请检查是其格式不正确,还是禁止了跨域访问。

如何编写Clientaccesspolicy.xml 和 Crossdomain.xml详见本博客

Silverlight访问webService跨域问题的解决之二

Silverlight解决的文件(直接放入发布网站的根目录) Silverlight解决的文件(直接放入发布网站的根目录) Silverlight解决的文件(直接放入发布网站的根目录) Silverlight解决的文件(直接放入发布网站的根目录) Silverlight解决的文件(直接放入发布网站的根目录) 立即下载

相关推荐

java解决请求的两种方法

主要为大家详细介绍了java解决请求的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

SilverLight访问及其常用的几种解决方法

<br />1、文章出处:http://www.cnblogs.com/liaohenchen/articles/silverlight-cross-domain.html<br /> <br />今天在做silverlight访问JSon数据的时候老是出现错误,才发现是问题,因此将这方面的内容整理一些,列了出来<br />SilverLight 出于对安全性的考虑默认情况下对URL的访问进行了严格的限制,只允许访问同一子下的URL资源。<br /><br />下表列出了Silverlight 2.

梦泣的专栏 1436

ServiceReferences.ClientConfig错误

ServiceReferences.ClientConfig错误,wcf服务错误

软件为伴 1168

Silverlight项目发布无法访问WebService接口问题

最近在开发一个silverlight项目,项目中需要从一个局网的WebService接口获得数据,在开发调试过程中,是可以获得数据的,但是当程序在IIS上发布之后,该接口竟然无法调用,于是从网上查找方法,试了好几种,终于把问题解决了,现在在这里和大家分享下. 至于无法访问WebService的原因,是因为服务的地址是指向本机localhost的一个端口,需要修改为你发布地址的端口; 由于发布

sciland的专栏 2113

web service访问问题解决办法

最近跟着陈刚老师做江西旅游通票的项目,目前尚处于技术储备阶段,分配给我的技术任务是用C#和C++客户端访问Java web service。我用C#的silverlight调用web service的时候老是出现访问的错误,经过几天的努力,终于把问题解决了。1. 首先确定web service已经成功发布,tomcat已经启动。测试方法是在浏览器中输入发布的WSDL文件的URL,如http://localhost:8080/axis2/services/helloWorld?wsdl 。如果正常显示ws

天外有天,人外有人。 专注品质 不断创新 让精益求精成为习惯 1501

Silverlight摆脱对 ServiceReferences.ClientConfig 的依赖

Silverlight 中,如果用 VS 添加对 WCF Service, 的引用,则会自动生成 ServiceReferences.ClientConfig 配置文件,其中包含该 Service 的 Binding 和 Address 等信息。将配置信息隔离出来本来是好事情,但问题是,由于 Silverlight 只是一个客户端 runtime 的特性决定,配置文件将被在编译时组装到 S

老陈代码记录 506

Silverlight访问webService问题解决之二

部署到IIS就有问题。首页可以打开,但是提示系统错误 原来就是的权限问题 错误提示: 尝试请求 URI“http://www.XXX.com/PhotoWebService.asmx”时发生错误。这可能是因为在没有适当的策略的情况下试图以方式访问服务,或者是策略不适用于 SOAP 服务。您可能需要与服务所有者联系以发布策略文件,确保策略允许发送与 SOAP 相关的 ...

115

Silverlight调用WebService时出现的方式访问服务

<br />最近在项目中发现Silverlight调用WebService全出现一个方式访问异常,异常信息如下:<br /> <br />“这可能是因为在没有适当的策略的情况下试图以方式访问服务,或者是策略不适用于 SOAP 服务。您可能需要与服务所有者联系以发布策略文件,确保策略允许发送与 SOAP 相关的 HTTP 头。请参阅内部异常以了解详细信息。” <br /> <br />发现这个问题,一直在虚拟目录下面的东东,尝试了各种方法,因为我的网站下面有很多子网站,所以在这现在部署WebS

ASP.NET 爱好者 1948

Silerlight调用WCF、Web Service、Wcf Ria Service问题

我们往往需要调用已建好的WCF,Web Service,Wcf Ria Service,这些调用的程序项目往往是另开一个的一个解决方案,这往往导致调用服务者和发布服务者不是同一个服务器上,即使在同一服务器上,因程序的端口好不同,而会产生问题。 (一)原因分析: Silverlight 在默认情况下只允许源站点通信。例如,在 http://contoso.com/m...

weixin_30419799的博客 79

Silverlight Crossdomain Access WebService And Debug

Silverlight Crossdomain Access WebService And Debug 主要是在你的Web Service目录下,放个clientaccesspolicy.xml 注意是根目录。我只有放在C:\netpub\wwwroot才行,虚拟目录下不行。 在项目中使用SilverLight调用WebService,经常出现在Debug状态下无法访问WebServic

Angelo Lee's Blog 795

SilverLight异步调用WebService出错!

SilverLight异步调用WebService出错! Silvert調用WebService會出現如下錯 誤,是怎麼回事啊? 嘗試向 URI http://localhost/WebServices/WeatherWebService.asmx 進行要求時發生錯誤。這可能是因為嘗試以方式存取服務,而沒有適當的原則所造成,或是由不適用於 SOA...

171

Silverlight访问WebService的Crossdomain以及调试

在项目中使用SilverLight调用WebService,经常出现在Debug状态下无法访问WebService的情况。 假设WebService部署在http://localhost/SonicLocalizationService/LocalizationWebService.asmx。当以Debug运行SilverLight时,SilverLight网页运行在VS的内置Web Serve...

weixin_30784945的博客 117

Silverlight访问安全性问题

 也谈我如何解决Silverlight访问安全性问题 时间:2011-09-25 07:46来源:博客园 作者:刺客之家 点击:504次 一、问题 Silverlight访问WebService的时候,是需要在被访问的服务部署目录下检测到访问安全策略文件的。因此在很多silverlight应用使用第三方服务的时候,就受到了很多限制。那么如果服务提供者不提供策略文件,我们怎么做

wheroy的专栏 701

Silverlight 2beta2 调用 SharePoint的WebService......

    由于Silverlight访问SharePoint里List的数据,所以需要在Silverlight里调用SharePoint的相应的WebService。       一开始我在VS.net2008里Silverlight工程下添加“Service Reference”时,总是出现“Object reference not set to an instance of an ob

野文的专栏 3136

如何解决Silverlight访问安全性问题

一、问题 Silverlight访问WebService的时候,是需要在被访问的服务部署目录下检测到“访问安全策略文件”的。因此在很多silverlight应用使用第三方服务的时候,就受到了很多限制。那么如果服务提供者不提供策略文件,我们怎么做才能在应用中使用这些服务?我通常采用下面的方法解决。 二、思路 访问安全性问题,在于Silverlight自身做的限制,如果SL应用访问一个...

weixin_34001430的博客 190

SliverLight访问

Silerlight调用WCF、Web Service、Wcf Ria Service问题       我们往往需要调用已建好的WCF,Web Service,Wcf Ria Service,这些调用的程序项目往往是另开一个的一个解决方案,这往往导致调用服务者和发布服务者不是同一个服务器上,即使在同一服务器上,因程序的端口好不同,而会产生问题。 如何

Welcome to Billowaves' 708

Silverlight关于访问问题

       Silverlight中调用WebService或者Wcf时涉及到访问问题,一般的问题是两个XML文件,这里摘录如下:crossdomain.xml 文件的代码: 以下是 clientaccesspolicy.xml

vs2005的专栏 635
上一篇: Silverlight边学边写之一“Silverlight+Webservice+Dataset”综合应用
下一篇: Silverlight访问webService跨域问题的解决之二
dangelrose
博客等级 码龄17年 11粉丝 485原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值