代码之家  ›  专栏  ›  技术社区  ›  stiank81

在Silverlight项目中放置ClientAccessPolicy.xml的位置

  •  3
  • stiank81  · 技术社区  · 15 年前

    我在客户机上有一个Silverlight应用程序通过WCF与服务器端通信。我偶尔会得到一个通信异常——尤其是在向服务的某些参数传递大量数据时。有人告诉我,如果希望Silverlight应用程序与这样的服务器通信,我需要一个clientaccesspolicy.xml文件-以防止跨站点脚本。

    所以-我创建了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>
    

    但现在我不知道该把它放在哪里。我需要告诉任何人它在哪里吗?这可能是解决我问题的方法吗?

    1 回复  |  直到 15 年前
        1
  •  6
  •   Johannes    15 年前

    是的,如果希望Silverlight与外部源进行通信,则需要clientaccesspolicy.xml。

    您没有指定WCF服务是作为服务托管、自托管还是在IIS中托管。如果该文件位于IIS中,则该文件将放置在共享文件夹(网站)的根目录中。

    如果服务是自托管的,那么您可以阅读此 article .

    对于Windows服务,您可以参考以下内容 article

    但是如果你只是偶尔得到错误,那么这可能不是你最大的问题。考虑到您说在尝试发送大参数时会发生错误的事实,这意味着您必须查看WCF服务和客户机的绑定。这些限制通常类似于每个呼叫16KB。这可以在服务端完成,方法是创建一个允许传递大量数据的绑定。

    <basicHttpBinding>
            <binding name="NewBinding0" maxBufferSize="104857600" maxReceivedMessageSize="104857600">
              <readerQuotas maxDepth="104857600" maxStringContentLength="104857600"
                maxArrayLength="104857600" maxBytesPerRead="104857600" maxNameTableCharCount="104857600" />
            </binding>
          </basicHttpBinding>
    

    然后将其与端点关联。

    如果您在客户端查看servicereferences.clienconfig文件,应该会看到一个到wcf服务的绑定。

    您可以编辑它,使其看起来像:

    <binding name="ProductConfig" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
                      <security mode="None" />
                    </binding>
    

    编辑 : 下面是如何在服务器端添加绑定。

    • 右键单击web.config并说“编辑WCF配置”
    • 在右侧,有一个树元素“bindings”
    • 右键单击并说“添加新绑定”
    • 命名绑定并将所有max*元素设置为任意大的数字。
    • 通过扩展服务并选择正在使用的端点,将此绑定与端点关联。在绑定配置中,选择新绑定。

    您还可以通过查找元素手动将其添加到web.config文件中。

    <system.serviceModel>
    

    应该有一个 <bindings> 其中的某个子元素。 您可以添加绑定,如上面所示。然后向下滚动到显示端点的位置,并在XML中添加bindingConfiguration=“newbinding0”标记。

    编辑取2 :

    好吧,当然,下面是我的一个项目中的一个例子:

    <system.serviceModel>
    
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
        <extensions>
    
        </extensions>
        <bindings>
          <basicHttpBinding>
            <binding name="NewBinding0" maxBufferSize="104857600" maxReceivedMessageSize="104857600">
              <readerQuotas maxDepth="104857600" maxStringContentLength="104857600"
                maxArrayLength="104857600" maxBytesPerRead="104857600" maxNameTableCharCount="104857600" />
            </binding>
          </basicHttpBinding>
          <mexHttpBinding>
            <binding name="NewBinding1" />
          </mexHttpBinding>
        </bindings>
        <behaviors>
          <endpointBehaviors>
            <behavior name="policyBehavior">
              <webHttp />
            </behavior>
            <behavior name="NewBehavior" />
          </endpointBehaviors>
          <serviceBehaviors>
            <behavior name="NewBehavior">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <services>
          <service behaviorConfiguration="NewBehavior" name="ALMWCFHost.ServiceModel">
            <clear />
            <endpoint address="GuildService" binding="basicHttpBinding" bindingConfiguration="NewBinding0"
              name="ProductConfig" contract="ALMWCFHost.IProductConfigModel"/>
            <host>
              <baseAddresses>
                <add baseAddress="http://omrsrv004/" />
              </baseAddresses>
            </host>
          </service>
        </services>
      </system.serviceModel>
    

    如果您对此有更多问题,请提供有关您使用的IDE以及最初如何添加服务端点的详细信息。