Deploy RichTextBox to IIS, Azure App Service, Linux with nginx, or Docker containers.
Before You Deploy
RichTextBox.lic is included in the publish output (content root)
wwwroot/uploads directory exists and is writable by the app pool identity
app.UseStaticFiles() is called before app.MapRichTextBoxUploads()
Maximum request body size is configured for large file uploads
Option 1
Publish the application and configure IIS with the ASP.NET Core Hosting Bundle. Set maxAllowedContentLength in web.config for large uploads.
dotnet publish -c Release -o ./publishAdd to web.config for uploads larger than 30 MB:
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="52428800" />
</requestFiltering>
</security>
</system.webServer>Option 2
Deploy using Visual Studio Publish, Azure CLI, or GitHub Actions. Ensure the license file is included in the publish output.
az webapp deploy --resource-group MyGroup \
--name my-richtextbox-app \
--src-path ./publish.zipFor persistent upload storage, consider mounting Azure Blob Storage or using a custom storage provider instead of the default local file system.
Option 3
Run Kestrel behind an nginx reverse proxy. Configure client_max_body_size for large uploads.
server {
listen 80;
server_name example.com;
client_max_body_size 50M;
location / {
proxy_pass http://localhost:5000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Configuration
Configure Kestrel to accept large upload requests in Program.cs:
builder.WebHost.ConfigureKestrel(options =>
{
options.Limits.MaxRequestBodySize = 50 * 1024 * 1024; // 50 MB
});AI Toolkit (optional)
If you register your own IRichTextBoxAiResolver, the editor calls your server instead of the local demo resolver. Expose whatever route suits your app (commonly /api/ai/ask and /api/ai/review) and call your upstream provider from there, holding the provider API key in your secrets store. The editor does not need additional endpoints beyond your own.
The shipped wwwroot/richtexteditor/rte.js prepends the rte-config.js defaults block as plain static JavaScript — editing RTE_DefaultConfig entries (e.g. a setResolver URL, AI persistence key) takes effect on the next page load without a rebuild or redeploy.