由于未访问我的客户端访问策略文件,因此发生了CommunicationException

时间:2011-05-13 14:25:53

标签: silverlight wcf clientaccesspolicy.xml

我有一个托管在控制台应用程序中的WCF服务 这是app.config文件:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CAVES.Framework.Network.IntegrationSuite.IntegrationServices.IntegrationServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="CrossDomainServiceBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="CAVES.Framework.Network.IntegrationSuite.IntegrationServices.IntegrationServiceBehavior"
        name="CAVES.Framework.Network.IntegrationSuite.IntegrationServices.IntegrationService">
        <endpoint address="" binding="basicHttpBinding" contract="CAVES.Framework.Network.IntegrationSuite.IntegrationServices.Interfaces.IIntegrationService">

        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8731/IntegrationService" />
          </baseAddresses>
        </host>
      </service>
      <service name="CAVES.Framework.Network.IntegrationSuite.IntegrationServices.CrossDomainService">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost" />
          </baseAddresses>
        </host>
        <endpoint address="" binding="webHttpBinding" contract=
"CAVES.Framework.Network.IntegrationSuite.IntegrationServices.Interfaces.ICrossDomainService" behaviorConfiguration="CrossDomainServiceBehavior"/>
      </service>
    </services>
  </system.serviceModel>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

当我使用套接字访问它时,正确获取了客户端访问策略,但是当我尝试调用IntegrationService的方法时,它给出了以下异常:

  

尝试制作时发生错误   对URI的请求   的 'http://本地主机:8731 / IntegrationService'。   这可能是由于尝试   以跨域方式访问服务   没有适当的跨域政策   到位,或政策   不适合SOAP服务。你可以   需要联系的所有者   服务以发布跨域   策略文件并确保它允许   要发送的与SOAP相关的HTTP标头。   使用此错误也可能是由此引起的   Web服务中的内部类型   没有使用的代理   InternalsVisibleToAttribute属性。   请查看内部异常   更多细节。

     

内部例外:
  {System.Security.SecurityException   ---&GT; System.Security.SecurityException:   安全错误。在   System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult的   asyncResult)at   System.Net.Browser.BrowserHttpWebRequest&LT;&GT; C_ DisplayClass5.b _4(对象   sendState)at   System.Net.Browser.AsyncHelper。&lt;&gt; c_ DisplayClass4.b _1(Object sendState)---内部结束   异常堆栈跟踪--- at   System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback   beginMethod,Object state)at   System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult的   asyncResult)at   System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult的   结果)}

我的客户端访问策略文件看起来很好,它应该工作,我不知道为什么它不。

<?xml version="1.0" encoding ="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from>
        <domain uri="*" />
      </allow-from>
      <grant-to>
        <socket-resource port="4502-4534" protocol="tcp" />
      </grant-to>
    </policy>
    <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>

1 个答案:

答案 0 :(得分:1)

  

当我使用套接字访问它时,   获取客户端访问策略   正确,但当我试图打电话给   IntegrationService的方法吧   给了我以下例外

您的跨域策略文件仅允许来自端口4502到4534的套接字连接,但您的应用程序正在尝试访问端口8731.除非应用程序是在浏览器外安装的(具有提升的权限),否则Silverlight只能访问此端口范围,所以8731将无效。

现在,您的服务正在使用BasicHttpBinding,因此我假设您正在使用HTTP。在这种情况下,策略文件必须在与服务相同的域中提供,必须位于域根目录(在您的情况下为http://localhost:8731/clientaccesspolicy.xml)。 http://blogs.msdn.com/b/carlosfigueira/archive/2008/03/07/enabling-cross-domain-calls-for-silverlight-apps-on-self-hosted-web-services.aspx上的博客文章提供了有关如何为自托管服务启用SL的跨域调用的更多信息。