从Silverlight调用WCF服务
我正在从silverlight调用一个本地托管的wcf服务,我得到下面的异常 Iv创建了一个clientaccesspolicy.xml,它位于我的主机路径中从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="*">
<?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=""*"" />