Xdt 转换为多个绑定添加安全模式

Xdt Transform To Add Security Mode to multiple bindings

我的 Web 应用程序使用多个 Web 服务,因此我对每个服务都进行了绑定,如下所示:

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="BasicHttpBinding_ICityDataService" allowCookies="true" maxBufferPoolSize="10000000" maxBufferSize="10000000" maxReceivedMessageSize="10000000">
        <readerQuotas maxDepth="32" maxStringContentLength="10000000" maxArrayLength="10000000" />
      </binding>
      <binding name="BasicHttpBinding_IBuildingDataService" allowCookies="true" maxBufferPoolSize="10000000" maxBufferSize="10000000" maxReceivedMessageSize="10000000">
        <readerQuotas maxDepth="32" maxStringContentLength="10000000" maxArrayLength="10000000" />
      </binding>
      <binding name="BasicHttpBinding_IEventDataService" allowCookies="true" maxBufferPoolSize="10000000" maxBufferSize="10000000" maxReceivedMessageSize="10000000">
        <readerQuotas maxDepth="32" maxStringContentLength="10000000" maxArrayLength="10000000" />
      </binding>
      ...
    </basicHttpBinding>
  </bindings>

在我的开发环境中,我不能使用 SSL(也不需要),但是当我去部署时,我必须使用 SSL,所以我需要为每个绑定添加一个安全模式。我应用了以下 XDT 转换:

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding>
        <security mode="Transport" xdt:Transform="Insert">
          <transport clientCredentialType="None" />
        </security>
      </binding>
    </basicHttpBinding>
  </bindings>

但这只是将安全模式添加到第一个绑定。但是即使在阅读了 XDT Transform documentation 和许多文章以及 SO question/answers 之后,我也不知道如何指定一个定位器,它将 select 所有绑定,以便将子节点添加到所有他们中的。我可以按名称指定每个绑定,但这看起来很笨重。有什么想法吗?

据我所知,XDT 转换不支持你想要实现的(即在多个元素上插入新元素),很遗憾!

解决该问题的一种方法可能是将安全节点添加到开发环境的所有绑定中,并将其设置为 None.

然后您可以进行一些全局替换以将所有属性更新为 Transport

你的 web.config 应该是这样的

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="BasicHttpBinding_ICityDataService" allowCookies="true" maxBufferPoolSize="10000000" maxBufferSize="10000000" maxReceivedMessageSize="10000000">
        <readerQuotas maxDepth="32" maxStringContentLength="10000000" maxArrayLength="10000000" />
        <security mode="None">
          <transport clientCredentialType="None" />
        </security>
      </binding>
      <binding name="BasicHttpBinding_IBuildingDataService" allowCookies="true" maxBufferPoolSize="10000000" maxBufferSize="10000000" maxReceivedMessageSize="10000000">
        <readerQuotas maxDepth="32" maxStringContentLength="10000000" maxArrayLength="10000000" />
        <security mode="None">
          <transport clientCredentialType="None" />
        </security>
      </binding>
      <binding name="BasicHttpBinding_IEventDataService" allowCookies="true" maxBufferPoolSize="10000000" maxBufferSize="10000000" maxReceivedMessageSize="10000000">
        <readerQuotas maxDepth="32" maxStringContentLength="10000000" maxArrayLength="10000000" />
        <security mode="None">
          <transport clientCredentialType="None" />
        </security>
      </binding>
      </basicHttpBinding>
  </bindings>
</system.serviceModel>

你的 XDT 转换应该是这样的

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

  <!-- Define Global Replacements -->
  <replaceAll>
      <WCF_replaceBindingSecurityMode xdt:Locator="XPath(//basicHttpBinding/binding/security)" xdt:Transform="SetAttributes(mode)" mode="Transport" />
  </replaceAll>

</configuration>