我有一个托管在控制台应用程序中的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>
答案 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的跨域调用的更多信息。