C:\Program Files (x86)\MSBuild\HedgehogDevelopment\SitecoreProject\v9.0\HedgehogDevelopment.SitecoreProject.targets(631, 5): Deploy failed. Reason: The request channel timed out while waiting for a reply after 00:03:57. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout.

If you’re using TDS on your build server, and you’ve seen this message, you’ve probably pulled your hair out a little. I know I have.  In our QAenvironment for a client, there is a TON of content.  A ton of content that isn’t in Development or even the local developer environments.  Why is TDS failing to deploy to that environment?  Here’s why:

One of the build steps in a TDS Deploy is to copy the connector out to the bin folder of the site.  That’s going to end up recycling your app.  The next step it to try to connect to the “/_DEV/TdsService.asmx” WCF Endpoint to do the sync.  That’s where the timeout applies.  How do you increase that timeout?  Good question!  Here’s the answer:

Open up the config file for the task at c:\Program Files (x86)\MSBuild\HedgehogDevelopment\SitecoreProject\v9.0\HedgehogDevelopment.SitecoreProject.Tasks.dll.config. It should look a little something like this:

<?xml version="1.0" encoding="utf-8" ?>
                <binding name="TdsServiceSoap" closeTimeout="00:01:00" openTimeout="00:01:00"
                    receiveTimeout="00:10:00" sendTimeout="00:04:00" allowCookies="false"
                    bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxBufferSize="16000000" maxReceivedMessageSize="16000000"
                    textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"
                    <readerQuotas maxDepth="32" maxStringContentLength="524288" maxArrayLength="16000000"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="Ntlm" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                <binding name="TdsServiceSoap1" />
            <endpoint address="http://localhost/_dev/tdsservice.asmx" binding="basicHttpBinding"
                bindingConfiguration="TdsServiceSoap" contract="SitecoreConnector.TdsServiceSoap"
                name="TdsServiceSoap" />
            <endpoint address="http://sitecore7.local/_DEV/TdsService.asmx"
                binding="basicHttpBinding" bindingConfiguration="TdsServiceSoap1"
                contract="SitecoreConnector.TdsServiceSoap" name="TdsServiceSoap1" />

Note line 7 above. See the sendTimeout=”00:04:00″. Go ahead and set that to something a bit higher.  This will give your TDS Deploy a little room to breath when it does its work.