2008-09-23 168 views
4

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

我创建了一个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' 请求时发生。 这可能是由于跨域 配置错误。有关更多详细信息,请参阅 内部例外。 --->

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

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

回答

0

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

7

还有如果你是在同一位置的Silverlight应用程序从您担任不需要跨域策略使用WCF服务的一些调试技术listed here ..one更useful post ..

0

。从客户端返回多个实体之间存在关系的LINQ to SQL数据时,我遇到过类似的错误。

首先确保你的WCF服务工作正常。通过创建一个简单的ping函数来回应它的输入。确保你可以先打电话。如果这个工作正常,并且你的其他函数没有使用函数的参数或返回值。如果第一个函数也无法使用像Fiddler这样的工具来查看通过线路发送的数据。用一个 。在主机的末尾查看localhost的数据。所以像http // localhost:1234./default.aspx,并使用相同的WCF地址。

2

我知道这个服务是否正常工作,因为我加了它作为一个基本的网站参考,有效。我会尝试和Fiddler一起玩,尽管有一个小问题,因为xaml控件并没有嵌入到网页中,它使用内置的测试页面渲染器。

这里有几个指标,这四中必须检查的需要:

添加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

0

我有同样的问题。我确实看到clientaccesspolicy.xml被silverlight客户端应用程序成功获取。我确实通过直接通过firefox请求clientaccesspolicy.xml不是错误的。这个政策是开放的,和上面一样。

现在来了奇怪的转折。如果我删除clientaccesspolicy.xml,而添加Flash风格crossdomain.xml策略文件,那么它的工作原理。我通过检查网络看到,如何首先请求clientaccesspolicy.xml失败,然后silverlight返回到crossdomain.xml。

所以我有一个解决办法,但我更喜欢使clientaccesspolicy.xml工作,以便没有额外的不必要的网络往返。

有什么建议吗?

1

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

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

概括地说,虽然,你必须具有crossdomain.xml并没有 '标题= “*”'

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

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

而不是*你可以有“SOAPAction的头“(作品的任何一种方式)

哦,当你得到它的工作,你可能要使它安全些:-)

祝你好运!

0

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

0

我有一个类似的问题,删除服务引用,并再次加回来解决了我的问题。