Xdt Transform To Add Security Mode to multiple bindings

1.3k Views Asked by At

My web application makes use of multiple web services, so I have bindings to each of them, like this:

<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>

On my development environment, I cannot use SSL (and do not need it), but when I go to deploy, I have to use SSL, so I need to add a security mode to each of those bindings. I applied the following XDT transform:

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

But that only adds the security mode to the first binding. But even after reading the XDT Transform documentation and a number of articles and SO question/answers, I cannot figure out how to specify a locator that will select all the bindings so that child node gets added to all of them. I could specify each of the bindings by name, but that seems clunky. Any ideas?

1

There are 1 best solutions below

1
On BEST ANSWER

As far as I know, what you want to achieve (i.e. inserting new element on multiple elements) is not supported by XDT transformations, which is a pity!

One way to workaround the problem might be to add the security node to all your bindings for your development environment and set it to None.

You can then have some global replacements to update all attributes to Transport

Your web.config should be something like

<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>

And your XDT transform should be like

<?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>