从Silverlight调用WCF服务

从Silverlight调用WCF服务,wcf,silverlight,securityexception,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="*">

我正在从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>

'.
这可能是由于跨域
配置错误。请看
有关详细信息,请参阅内部异常。-->

{System.Security.SecurityException --->System.Security.SecurityException: 安全错误。在 MS.Internal.InternalWebRequest.Send() 在 System.Net.BrowserHttpWebRequest.BeginGetResponseImplementation()的 在 System.Net.BrowserHttpWebRequest.InternalBeginGetResponse(异步回调 回调,对象状态)在 System.Net.AsyncHelper.c_uuuuDisplayClass4.b_uuuu3(对象发送状态)---内部 异常堆栈跟踪---在 System.Net.AsyncHelper.BeginNoui(BeginMethod beginMethod,异步回调, 对象状态)在 System.Net.BrowserHttpWebRequest.BeginGetResponse(异步回调 回调,对象状态)在 System.ServiceModel.Channel.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteSend(IAsyncResult 结果)在 System.ServiceModel.Channel.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnSend(IAsyncResult 结果}


有什么想法吗?

首先,我要确保Silverlight通过使用Fiddler、FireBug、,或类似的工具。

有一些调试技术。还有一个。

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


首先确保WCF服务正常工作。为此,创建一个简单的ping函数,只回显其输入。确保你可以先打这个电话。如果这样做有效,而您的另一个函数不起作用,那么它就是有参数的,或者是函数的返回。如果第一个函数也失败了,使用类似Fiddler的工具查看通过导线发送的数据。使用一个。在主机的末尾查看本地主机的数据。所以类似于http//localhost:1234./default.aspx,并将其用于WCF地址。

我通过一个网络广播尝试演示了一些我写过的技术:

我知道该服务工作正常,因为我将其添加为对一个基本网站的引用,并且它工作正常。我将尝试使用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>
有用的内容如下:


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

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

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


有什么建议吗?

我找到了约翰·帕帕的那本书,对这本书进行了详细的研究。我也有同样的问题,这本优秀的书解释了这一切。

我不知道你的问题是否相同,但我刚刚在博客中讲述了我在本周末试图让我的SL应用程序与我的控制台托管WCF服务进行跨域对话时遇到的主要痛苦

但简单地说,您必须有一个crossdomain.xml,并且没有“headers=“*””

坏:
好:
对于标题,您可以使用“SOAPAction”(工作的任意一种方式),而不是*

哦,当你让它工作时,你可能想让它更安全一点:-)


祝你好运

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

我遇到了类似的问题,删除服务引用并重新添加解决了这个问题

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
Bad:
    <allow-access-from domain=""*"" headers="*" />

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