我正在尝试构建一个概念验证Csla 3.7 / Silverlight 3应用程序,并且一直在Rocky's tutorials工作。这是一个非常简单的一个表单/一个业务对象数据编辑应用程序,直到我尝试配置Wcf以便Silverlight应用程序可以与数据门户进行通信时,一切都只是极好的。
我得到的错误是:
CommunicationException was unhandled by user code
An error occurred while trying to make a request to URI 'http://localhost:1406/WcfPortal.svc'.
This could be due to attempting to access a service in a cross-domain way without a proper cross-domain policy in place, or a policy that is unsuitable for SOAP services.
You may need to contact the owner of the service to publish a cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent.
This error may also be caused by using internal types in the web service proxy without using the InternalsVisibleToAttribute attribute.
Please see the inner exception for more details.
我对此完全不知情,因为我对Silverlight& WCF。对于Csla Silverlight应用程序,我的设置非常简单。我有4个项目:
在卡西尼的笔记本电脑上,一切都在本地运行。我希望DataPortal在Silverlight之外运行,以便我可以访问SQL Server。我认为问题可能出在Silverlight应用程序中的Wcf配置中,该应用程序在ServiceReferences.ClientConfig文件中指定:
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IWcfPortal" maxBufferSize="65536"
maxReceivedMessageSize="65536" receiveTimeout="10" sendTimeout="10">
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:1406/WcfPortal.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWcfPortal"
contract="Csla.WcfPortal.IWcfPortal" name="BasicHttpBinding_IWcfPortal" />
</client>
</system.serviceModel>
</configuration>
我想知道端口号是否重要,当我更改它时,我得到一个不同的错误。我也想知道端点地址的格式是否正确。
不确定它是否重要,但我在ASPNet web.config中的serviceModel设置是:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="WcfPortalBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="WcfPortalBehavior" name="Csla.Server.Hosts.Silverlight.WcfPortal">
<endpoint address="" binding="basicHttpBinding" contract="Csla.Server.Hosts.Silverlight.IWcfPortal">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
答案 0 :(得分:3)
如果我认为正确,那么错误可能会告诉您完全正确的事情,您错过了跨域策略。 silverlight应用程序正在从远程位置访问WCF服务,需要授权才能接受请求。
当项目分为三部分,SL App,WCF Web服务和网站时,这在我的开发中出现了。网站和WCF服务是独立运行的,尽管它们是同一解决方案的一部分。因此,卡西尼跑了两次,你正越过边界。
我有一个clientaccesspolicy.xml文件以及正在开发中具有以下内容的Web服务:
<?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>
该文件允许任何人和所有内容,您可以将其改进为生产,但在开发中它是最简单的方法。 Google wcf客户端访问策略/ wcf跨域策略 - 这是一个常见问题。