从Silverlight调用WCF服务
我正在从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的 结果) }
关于如何进步的任何想法?
我首先确定Silverlight实际上是通过使用Fiddler,FireBug或类似工具检查网络调用来找到您的客户端访问策略文件。
。从客户端返回多个实体之间存在关系的LINQ to SQL数据时,我遇到过类似的错误。
首先确保你的WCF服务工作正常。通过创建一个简单的ping函数来回应它的输入。确保你可以先打电话。如果这个工作正常,并且你的其他函数没有使用函数的参数或返回值。如果第一个函数也无法使用像Fiddler这样的工具来查看通过线路发送的数据。用一个 。在主机的末尾查看localhost的数据。所以像http // localhost:1234./default.aspx,并使用相同的WCF地址。
通过网络直播我这样做,可用一些调试技术,试图展示一些我写的技巧:https://www.livemeeting.com/cc/mseventsbmo/view?id=1032386656&role=attend&pw=F3D2F263
我知道这个服务是否正常工作,因为我加了它作为一个基本的网站参考,有效。我会尝试和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://silverlight.net/forums/t/19191.aspx
http://timheuer.com/blog/archive/2008/04/09/silverlight-cannot-access-web-service.aspx
我有同样的问题。我确实看到clientaccesspolicy.xml被silverlight客户端应用程序成功获取。我确实通过直接通过firefox请求clientaccesspolicy.xml不是错误的。这个政策是开放的,和上面一样。
现在来了奇怪的转折。如果我删除clientaccesspolicy.xml,而添加Flash风格crossdomain.xml策略文件,那么它的工作原理。我通过检查网络看到,如何首先请求clientaccesspolicy.xml失败,然后silverlight返回到crossdomain.xml。
所以我有一个解决办法,但我更喜欢使clientaccesspolicy.xml工作,以便没有额外的不必要的网络往返。
有什么建议吗?
不知道你的问题是否相同,但我刚刚讨论了我本周末尝试通过我的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的头“(作品的任何一种方式)
哦,当你得到它的工作,你可能要使它安全些:-)
祝你好运!
确保WCF服务的端点和绑定已正确定义。从同一应用程序调用WCF服务不需要跨域策略文件。
我有一个类似的问题,删除服务引用,并再次加回来解决了我的问题。