.net - 将 clientaccesspolicy.xml 放在 Silverlight 项目中的什么位置

标签 .net wcf silverlight

我在客户端有一个 Silverlight 应用程序通过 WCF 与服务器端通信。我偶尔会收到 CommunicationException - 特别是在将大量数据传递给服务的某些参数时。有人告诉我,如果我希望 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>

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

最佳答案

是的,当您希望 Silverlight 与外部源通信时,您需要一个 clientaccesspolicy.xml。

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

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

对于Windows Service,可以引用以下article

但如果您只是偶尔遇到错误,那么这可能不是您最大的问题。看看你说当你试图发送大参数时发生错误的事实,这意味着你将不得不查看 WCF 服务和客户端的绑定(bind)。这些限制通常是每次调用 16kb。这可以在服务端完成,方法是创建允许传递大量数据的绑定(bind)。

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

然后将其关联到端点。

如果您查看客户端的 ServiceReferences.ClienConfig 文件,您应该会看到一个到 WCF 服务的绑定(bind)。

您可以将其编辑为如下所示:

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

编辑: 以下是如何在服务器端添加绑定(bind)。

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

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

<system.serviceModel>

应该有一个 <bindings>那里某处的子元素。 您可以在其中添加如上所示的绑定(bind)。然后向下滚动到显示端点的位置,并在其中的 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,以及您最初是如何添加服务端点的。

关于.net - 将 clientaccesspolicy.xml 放在 Silverlight 项目中的什么位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1371767/

相关文章:

c# - 使用 MVC/WebApi 和 WCF 的解决方案 - 身份验证

wcf - 如何在 WCF 4.0 REST 服务上启用基本身份验证?

javascript - 在 Silverlight 中如何附加到 ScriptObject 上的事件?

c# - WinForms 中的 WPF : blocked on Dispatcher. 尽管 UI 线程处于事件状态但仍调用

c# - 启用基本和 Windows 身份验证

c# - String 、 Int32 等的操作在哪里定义?

c# - 在 WCF 服务中发送具有从同一父级派生的不同类的对象列表

c# - 如何解决 Dapper System.Data.DataException HResult=0x80131501 InvalidCastException Invalid cast from 'System.String' to 'System.Uri'

jquery - 什么是缓动函数?

silverlight - 如何以编程方式修改数据模板?