Update DNN 9.x -> 10.x for core 2sxc development
DNN 10 is a major release with breaking changes. This recipe is written for a local 2sxc dnn development environment.
Reference environment used while writing this: D:\Projects\2sxc\2sxc-dnn\Website -> http://2sxc-dnn.dnndev.me/, DNN 9.11.2 -> DNN 10.3.3.
1. Decide the Target Versions
DNN publishes a mandatory Suggested Upgrade Path.
| From |
To |
Why this hop |
| 09.11.02 |
09.13.09 |
last 9.x stepping stone; do the Telerik removal here (download upgrade package) |
| 09.13.09 |
10.02.05 |
the big one - .NET 4.8, SQL 2017, forced Telerik removal, API removals (download upgrade package) |
| 10.02.05 |
10.03.03 |
current release, uses the new in-product upgrade (download install package) |
Notes:
- 2sxc compatibility: DNN 10.02+ requires 2sxc v21.01 or newer - see the Dnn Platform compatibility table. Older 2sxc will not work on DNN 10.2+.
- Everything below DNN 10.2.2 has open CVEs.
2. Prerequisites
- .NET Framework 4.8 installed (DNN 10.0.0 minimum), so just update your Windows 11 and VS2026 to latest version.
- SQL Server 2017 (v14.x) or newer (DNN 10.0.0 minimum)
- Download all three DNN Upgrade (2x) and Install (1x) packages from the release pages above
3. Backups
Do not skip this on a dev box either - you will want to retry the upgrade more than once.
- Full SQL backup of the dnn database
- File copy of the whole website folder (
D:\Projects\2sxc\2sxc-dnn\Website)
4. web.config Settings
<add key="AutoUpgrade" value="false" /> - you want the wizard, not a silent upgrade
<add key="UseInstallWizard" value="true" />
- For the 10.2.5 -> 10.3.3 hop, if the upload button is missing in the Persona Bar, add:
<add key="AllowDnnUpgradeUpload" value="true" />
- Clean large web.config after many upgrades
5. Run the Upgrades
5a. Classic method - for everything up to 10.2.x
- Stop the app pool (or sometimes you can use app_offline.htm)
- Unzip the Upgrade package over the website folder, overwriting existing files
- Start the app pool
- Browse to the site - the upgrade wizard starts automatically, or go to
https://2sxc-dnn.dnndev.me/install/upgradewizard.aspx
- Watch it to completion, do not navigate away
- In case of error check
Website\Providers\DataProviders\SqlDataProvider\*.log.resources - a empty file means the script ran clean; anything larger contains errors
- Repeat for the next hop
5b. New method - from 10.2.0 onwards
Starting with DNN 10.2.0 there is an in-product upgrade. See the Post-10.2.0 Upgrade Guide.
- Go to
Settings -> Servers -> System Info -> Upgrades
- Upload the 10.3.3 Install package there (do not unzip it over the folder)
- If you are coming from exactly 10.2.3, its upload feature is broken: copy the Install package into
Website\App_Data\Upgrade\ manually instead
- DNN drops an
app_offline.htm while unpacking (10.3.0+) - let it finish
Fix: Execution Timeout Expired During the SQL Scripts
Symptom - the wizard stops early with:
System.Data.SqlClient.SqlException (0x80131904): Execution Timeout Expired.
Why it happens - DNN calls SqlDataProvider.ExecuteScript(script, 0), where every upgrade statement runs with the ADO.NET default of 30 seconds. The statement has to finish inside 30 s, or you run it by hand.
fix - stv:
fix - general:
- Identify which statements failed: open the largest
*.log.resources file in Website\Providers\DataProviders\SqlDataProvider\
- Stop the app pool - a full stop, not
app_offline.htm
- Run SqlDataRPovder script in SSMS, which has no command timeout.
- Start the app pool and re-run
Install/Install.aspx?mode=upgrade
The same approach works for any failing statement: DNN logs the exact SQL it tried, so pull it out of the log file and run it manually.
Fix: "Add New Site" fails on DNN 10.3.3 - missing allowjsinhtmlmodule in schema
Fix: "Add New Site" fails on DNN 10.3.3 - missing allowjsinhtmlmodule in schema
6. Update 2sxc
Do this after DNN reaches its final version, not between hops.
- Install 2sxc v22 or newer via
Settings -> Extensions -> Install Extension
In stv 2sxc-dnn I had to manualy sync dll's, before I could install 2sxc.
Notes (stv manual adjustments in 2sxc dnn dev env):
Step 1 - before 2sxc v22 module installation of
- DELETE from bin
- ToSic.Eav.Data.Persistence.dll
- ToSic.Lib.LookUp.dll
- UPDATE 3 sections in web.config
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.Configuration.Abstractions" publicKeyToken="adb9793829ddae60" />
<bindingRedirect oldVersion="0.0.0.0-32767.32767.32767.32767" newVersion="2.2.0.0" />
</dependentAssembly>
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" />
<bindingRedirect oldVersion="0.0.0.0-32767.32767.32767.32767" newVersion="2.2.0.0" />
</dependentAssembly>
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.Primitives" publicKeyToken="adb9793829ddae60" />
<bindingRedirect oldVersion="0.0.0.0-32767.32767.32767.32767" newVersion="2.2.0.0" />
</dependentAssembly>
- DELETE 8 sections in web.config
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" />
<codeBase version="2.2.0.0" href="bin\Imageflow\Microsoft.Extensions.DependencyInjection.Abstractions.dll" />
</dependentAssembly>
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection" publicKeyToken="adb9793829ddae60" />
<codeBase version="2.2.0.0" href="bin\Imageflow\Microsoft.Extensions.DependencyInjection.dll" />
</dependentAssembly>
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.FileProviders.Abstractions" publicKeyToken="adb9793829ddae60" />
<codeBase version="2.2.0.0" href="bin\Imageflow\Microsoft.Extensions.FileProviders.Abstractions.dll" />
</dependentAssembly>
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.Hosting.Abstractions" publicKeyToken="adb9793829ddae60" />
<codeBase version="2.2.0.0" href="bin\Imageflow\Microsoft.Extensions.Hosting.Abstractions.dll" />
</dependentAssembly>
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.Configuration.Abstractions" publicKeyToken="adb9793829ddae60" />
<bindingRedirect oldVersion="0.0.0.0-2.1.1.0" newVersion="2.1.1.0" />
<bindingRedirect oldVersion="2.2.0.0-32767.32767.32767.32767" newVersion="2.2.0.0" />
<codeBase version="2.2.0.0" href="bin\Imageflow\Microsoft.Extensions.Configuration.Abstractions.dll" />
</dependentAssembly>
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" />
<bindingRedirect oldVersion="0.0.0.0-2.1.1.0" newVersion="2.1.1.0" />
<bindingRedirect oldVersion="2.2.0.0-32767.32767.32767.32767" newVersion="2.2.0.0" />
<codeBase version="2.2.0.0" href="bin\Imageflow\Microsoft.Extensions.Logging.Abstractions.dll" />
</dependentAssembly>
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.Primitives" publicKeyToken="adb9793829ddae60" />
<bindingRedirect oldVersion="0.0.0.0-2.1.1.0" newVersion="2.1.1.0" />
<bindingRedirect oldVersion="2.2.0.0-32767.32767.32767.32767" newVersion="2.2.0.0" />
<codeBase version="2.2.0.0" href="bin\Imageflow\Microsoft.Extensions.Primitives.dll" />
</dependentAssembly>
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.IO.RecyclableMemoryStream" publicKeyToken="31bf3856ad364e35" />
<codeBase version="3.0.1.0" href="bin\Imageflow\Microsoft.IO.RecyclableMemoryStream.dll" />
</dependentAssembly>
- ADD 3 sections in web.config
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.FileProviders.Abstractions" publicKeyToken="adb9793829ddae60" />
<bindingRedirect oldVersion="0.0.0.0-32767.32767.32767.32767" newVersion="2.2.0.0" />
</dependentAssembly>
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.Hosting.Abstractions" publicKeyToken="adb9793829ddae60" />
<bindingRedirect oldVersion="0.0.0.0-32767.32767.32767.32767" newVersion="2.2.0.0" />
</dependentAssembly>
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.IO.RecyclableMemoryStream" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-32767.32767.32767.32767" newVersion="3.0.1.0" />
</dependentAssembly>
Step 2 - after 2sxc v22 module installation
- Duplicate assembly bindings manualy deleted from stv web.config (could not reproduce in other 2sxc dnn dev envs)
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.Configuration.Abstractions" publicKeyToken="adb9793829ddae60" />
<bindingRedirect oldVersion="0.0.0.0-2.1.1.0" newVersion="2.1.1.0" />
<bindingRedirect oldVersion="2.2.0.0-32767.32767.32767.32767" newVersion="2.2.0.0" />
</dependentAssembly>
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" />
<bindingRedirect oldVersion="0.0.0.0-2.1.1.0" newVersion="2.1.1.0" />
<bindingRedirect oldVersion="2.2.0.0-32767.32767.32767.32767" newVersion="2.2.0.0" />
</dependentAssembly>
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.Primitives" publicKeyToken="adb9793829ddae60" />
<bindingRedirect oldVersion="0.0.0.0-2.1.1.0" newVersion="2.1.1.0" />
<bindingRedirect oldVersion="2.2.0.0-32767.32767.32767.32767" newVersion="2.2.0.0" />
</dependentAssembly>
Reference Links