DNN · Instalación
Esta guía monta la pieza estática del recipe DNN: el DesktopModule mínimo que persiste credenciales cifradas y resuelve la URL del API. El sync nocturno y el embebido del widget viven en páginas dedicadas (ver enlaces al final).
Requisitos
| Componente | Mínimo |
|---|---|
| DNN Platform | 9.x |
| .NET Framework | 4.7.2+ (alternativa: .NET 8) |
| SQL Server | 2016 SP1+ |
| Permisos | Host (para HostSettings y Host → Schedule) |
NuGet packages a referenciar en el módulo:
<PackageReference Include="Polly" Version="8.*" />
<PackageReference Include="System.Net.Http.Json" Version="6.*" />
<PackageReference Include="System.Text.Json" Version="6.*" />
Crear el DesktopModule
Estructura mínima dentro de DesktopModules/Neuroon/:
Neuroon/
├── App_Code/Neuroon/
│ ├── NeuroonSettings.cs
│ ├── NeuroonClient.cs
│ ├── NeuroonProduct.cs
│ └── WidgetTokenProvider.cs
├── Module.dnn // manifest mínimo
├── ModuleSettings.ascx // pestaña de configuración (Host)
└── web.config // si necesitas overrides locales
El manifest Module.dnn puede ser tan simple como un módulo "blank" (sin vistas públicas). Solo necesitamos exponer la pestaña de Host Settings.
HostSettings cifrados
DNN ofrece HostController.Instance.UpdateEncryptedString(key, value, decryptionKey) para guardar credenciales cifradas con la decryption key del web.config. Crea cuatro entradas:
using DotNetNuke.Entities.Host;
using DotNetNuke.Common.Utilities;
string decryptionKey = Config.GetDecryptionkey();
HostController.Instance.Update("Neuroon.ShopId", "shop_xxxxxxxx", true);
HostController.Instance.UpdateEncryptedString("Neuroon.ApiKey", "sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", decryptionKey);
HostController.Instance.Update("Neuroon.ApiUrl", "https://dev-api.neuroon.ai", true);
HostController.Instance.Update("Neuroon.WidgetTokenCache", "", true);
Cita: el recipe end-to-end usa este patrón en
docs/docs/recipes/dnn-end-to-end.md(Paso 1).
Y un helper para leerlas con tipado fuerte:
using DotNetNuke.Entities.Host;
using DotNetNuke.Common.Utilities;
public static class NeuroonSettings
{
public static string ShopId =>
HostController.Instance.GetString("Neuroon.ShopId");
public static string ApiKey =>
HostController.Instance.GetEncryptedString("Neuroon.ApiKey", Config.GetDecryptionkey());
public static string ApiUrl =>
HostController.Instance.GetString("Neuroon.ApiUrl", "https://api.neuroon.ai");
}
Validar la instalación
Tras añadir las HostSettings, ejecuta una vez (desde un endpoint privado, una página de mantenimiento o un breakpoint en Application_Start):
using var http = new HttpClient { BaseAddress = new Uri(NeuroonSettings.ApiUrl) };
http.DefaultRequestHeaders.Add("X-Shop-API-Key", NeuroonSettings.ApiKey);
var resp = await http.GetAsync("/api/plugin/shops/me");
resp.EnsureSuccessStatusCode();
var body = await resp.Content.ReadAsStringAsync();
DnnLog.Info("Neuroon shop info: " + body);
Si recibes 200, las credenciales son correctas. Si recibes 401, revisa la key y la decryption key del web.config.
Permisos y firewall
DNN suele desplegarse detrás de IIS/ARR/Application Gateway. Asegúrate de que el AppPool puede salir a:
https://api.neuroon.ai(Production)https://dev-api.neuroon.ai(Development)https://cdn.neuroon.ai(carga del widget desde el navegador)
Si tu CSP del Skin filtra recursos de terceros, añade cdn.neuroon.ai y los hosts de API a script-src y connect-src.
Próximos pasos
- Sync de productos —
IScheduledTaskcon chunk 500. - Widget embed —
.ascx+ SRI + token cacheado. - Recipe · DNN end-to-end — guía completa de 60 min.
- Ejemplos ·
NeuroonClientcompleto.