从Silverlight调用WCF服务

时间:2008-09-23 16:30:58

标签: wcf silverlight securityexception

我从silverlight调用本地托管的wcf服务,我在下面得到了例外。

Iv创建了一个clientaccesspolicy.xml,它位于我主机的路径中。

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

尝试制作时发生错误   对URI的请求   'http://localhost:8005/Service1.svc'。   这可能是由于跨域   配置错误。请看看   更多细节的内部异常。 ---&GT;

     

{System.Security.SecurityException   ---&GT; System.Security.SecurityException:   安全错误。在   MS.Internal.InternalWebRequest.Send()   在   System.Net.BrowserHttpWebRequest.BeginGetResponseImplementation()   在   System.Net.BrowserHttpWebRequest.InternalBeginGetResponse(AsyncCallback的   回调,对象状态)at   System.Net.AsyncHelper。&lt;&gt; c__DisplayClass4.b__3(Object sendState)---内心的结束   异常堆栈跟踪--- at   System.Net.AsyncHelper.BeginOnUI(BeginMethod   beginMethod,AsyncCallback回调,   对象状态)   System.Net.BrowserHttpWebRequest.BeginGetResponse(AsyncCallback的   回调,对象状态)at   System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteSend(IAsyncResult的   结果)在   System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnSend(IAsyncResult的   结果)}

关于如何进步的任何想法?

10 个答案:

答案 0 :(得分:7)

有一些调试技术listed here ..还有一个useful post ..

答案 1 :(得分:2)

我知道该服务正常运行,因为我将其添加为基本网站的参考资料并且有效。我会尝试使用Fiddler,虽然有一个小问题,因为xaml控件没有嵌入到网页中,它使用内置的testpage渲染器。

以下是iv发现需要检查的一些指示:

添加clientaccesspolicy.xml作为我的问题。

将crossdomain.xml添加到主机路由:

<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

确保绑定是basicHttp,因为这是silverlight(当前)支持的唯一

该服务需要此属性:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

有用的读物​​: http://weblogs.asp.net/tolgakoseoglu/archive/2008/03/18/silverlight-2-0-and-wcf.aspx

http://timheuer.com/blog/archive/2008/06/06/changes-to-accessing-services-in-silverlight-2-beta-2.aspx

http://silverlight.net/forums/t/19191.aspx

http://timheuer.com/blog/archive/2008/04/09/silverlight-cannot-access-web-service.aspx

答案 2 :(得分:1)

我通过网络广播提供的一些调试技术试图展示我撰写的一些技术:https://www.livemeeting.com/cc/mseventsbmo/view?id=1032386656&role=attend&pw=F3D2F263

答案 3 :(得分:1)

不知道你的问题是否相同,但我刚刚写了一篇关于我本周末试图通过我的SL应用程序与我的控制台托管的WCF服务交谈来实现跨域发生的主要痛苦的博客。

http://wallism.wordpress.com/2009/03/01/silverlight-communication-exception/

简而言之,您必须拥有一个crossdomain.xml并且没有'headers =“*”'

Bad:
    <allow-access-from domain=""*"" headers="*" />

Good:
    <allow-access-from domain=""*"" />
    <allow-http-request-headers-from domain=""*"" headers=""*"" />

而不是*对于标题,你可以拥有“SOAPAction”(工作方式)

哦,当你确实开始工作时,你可能想让它更安全: - )

祝你好运!

答案 4 :(得分:0)

首先,我要确保Silverlight通过使用Fiddler,FireBug或类似工具检查网络调用来实际查找客户端访问策略文件。

答案 5 :(得分:0)

如果您在同一位置使用WCF服务,则从您那里提供Silverlight应用程序不需要跨域策略。从客户端返回LINQ to SQL数据时,我遇到了类似的错误,其中多个实体之间存在关系。

首先确保您的WCF服务正常运行。通过创建一个简单的ping函数来执行此操作,该函数只是回显其输入。确保你可以先打电话。如果这有效,而你的其他功能不是它的东西,无论是参数还是函数的返回。如果第一个函数也失败,请使用像Fiddler这样的工具来查看通过网络发送的数据。用一个 。在主机的末尾,从localhost查看数据。所以像http // localhost:1234./default.aspx这样的东西,并使用相同的WCF地址。

答案 6 :(得分:0)

我有同样的问题。我确实看到clientaccesspolicy.xml已成功获取silverlight客户端应用程序。我确实通过firefox直接请求clientaccesspolicy.xml没有格式错误。该政策是公开的,与上述政策相同。

现在出现奇怪的转折。如果我删除clientaccesspolicy.xml而是添加Flash样式的crossdomain.xml策略文件,那么它可以工作。我确实通过检查网络,首先请求clientaccesspolicy.xml如何失败,然后silverlight回退到crossdomain.xml。

所以我确实有一个解决方法,但我更喜欢使clientaccesspolicy.xml工作,这样就不会有额外的不需要的网络往返。

有什么建议吗?

答案 7 :(得分:0)

我找到了约翰帕帕的书Data-Driven Services with Silverlight 2来广泛地讨论这个问题。我有同样的问题,这本优秀的书解释了这一切。

答案 8 :(得分:0)

确保正确定义WCF服务的端点和绑定。从同一应用程序调用WCF服务不需要跨域策略文件。

答案 9 :(得分:0)

我遇到了类似的问题并删除了服务引用并再次添加它解决了我的问题。